@spencerls/react-native-nfc 1.0.6 → 1.0.8

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/API.md CHANGED
@@ -25,13 +25,29 @@ import { nfcService } from "@spencerls/react-native-nfc";
25
25
 
26
26
  ### Methods
27
27
 
28
- #### startReader(flags, onTag, options?)
28
+ #### enableReaderMode_ANDROID(flags)
29
+ Configures Android reader mode flags. Must be called before `startReader()` or `withTechnology()`.
30
+ No-op on iOS.
31
+
32
+ ```ts
33
+ nfcService.enableReaderMode_ANDROID(flags: number);
34
+ ```
35
+
36
+ **Example:**
37
+ ```ts
38
+ import { NfcAdapter } from "react-native-nfc-manager";
39
+
40
+ nfcService.enableReaderMode_ANDROID(
41
+ NfcAdapter.FLAG_READER_NFC_V | NfcAdapter.FLAG_READER_NO_PLATFORM_SOUNDS
42
+ );
43
+ ```
44
+
45
+ #### startReader(onTag, options?)
29
46
  Starts platform reader mode.
30
47
 
31
48
  ```ts
32
49
  nfcService.startReader(
33
- flags: number,
34
- onTag: (tag: TagEvent) => void,
50
+ onTag?: (tag: TagEvent) => void,
35
51
  options?: { cooldownMs?: number }
36
52
  )
37
53
  ```
@@ -130,16 +146,31 @@ import { ... } from "@spencerls/react-native-nfc";
130
146
 
131
147
  Automatically starts reader mode on mount and stops on unmount.
132
148
 
149
+ **Note:** Call `nfcService.enableReaderMode_ANDROID(flags)` before using this hook on Android.
150
+
133
151
  ```ts
134
152
  useNfc(
135
153
  (tagId: string) => { ... },
136
154
  {
137
- flags?: number,
138
155
  cooldownMs?: number
139
156
  }
140
157
  );
141
158
  ```
142
159
 
160
+ **Example:**
161
+ ```ts
162
+ import { nfcService } from "@spencerls/react-native-nfc";
163
+ import { NfcAdapter } from "react-native-nfc-manager";
164
+
165
+ // Call once at app startup
166
+ nfcService.enableReaderMode_ANDROID(NfcAdapter.FLAG_READER_NFC_V);
167
+
168
+ // Then use the hook
169
+ useNfc((tagId) => {
170
+ console.log("Scanned:", tagId);
171
+ }, { cooldownMs: 800 });
172
+ ```
173
+
143
174
  ---
144
175
 
145
176
  ## useNfcState()
@@ -156,8 +187,13 @@ const { mode, tag } = useNfcState();
156
187
 
157
188
  Manual control over reader mode.
158
189
 
190
+ **Note:** Call `nfcService.enableReaderMode_ANDROID(flags)` before calling `start()` on Android.
191
+
159
192
  ```ts
160
193
  const { start, stop } = useNfcReader();
194
+
195
+ // start signature:
196
+ start(onTag?: (tag: TagEvent) => void, options?: { cooldownMs?: number })
161
197
  ```
162
198
 
163
199
  ---
@@ -202,6 +238,7 @@ TagEvent
202
238
 
203
239
  # Internal Notes
204
240
 
241
+ - **Android reader mode flags** must be configured via `enableReaderMode_ANDROID()` before starting reader mode or using technology sessions.
205
242
  - iOS automatically restarts reader mode after each scan.
206
243
  - Android waits for cooldown before accepting next scan.
207
244
  - Technology sessions interrupt reader mode safely.
package/README.md CHANGED
@@ -35,18 +35,21 @@ Works with:
35
35
  ## Basic Usage (Reader Mode)
36
36
 
37
37
  ```tsx
38
- import { useNfc, useNfcState } from "@spencerls/react-native-nfc";
38
+ import { useNfc, useNfcState, nfcService } from "@spencerls/react-native-nfc";
39
39
  import { NfcAdapter } from "react-native-nfc-manager";
40
40
 
41
41
  export default function ScannerScreen() {
42
42
  const { mode } = useNfcState();
43
43
 
44
+ // Enable Android reader mode (call once, typically at app startup)
45
+ nfcService.enableReaderMode_ANDROID(
46
+ NfcAdapter.FLAG_READER_NFC_V |
47
+ NfcAdapter.FLAG_READER_NO_PLATFORM_SOUNDS
48
+ );
49
+
44
50
  useNfc((tagId) => {
45
51
  console.log("Scanned:", tagId);
46
52
  }, {
47
- flags:
48
- NfcAdapter.FLAG_READER_NFC_V |
49
- NfcAdapter.FLAG_READER_NO_PLATFORM_SOUNDS,
50
53
  cooldownMs: 800
51
54
  });
52
55
 
@@ -63,19 +66,21 @@ export default function ScannerScreen() {
63
66
  ## Manual Reader Control
64
67
 
65
68
  ```tsx
66
- import { useNfcReader } from "@spencerls/react-native-nfc";
69
+ import { useNfcReader, nfcService } from "@spencerls/react-native-nfc";
67
70
  import { NfcAdapter } from "react-native-nfc-manager";
68
71
 
69
72
  export default function Screen() {
70
73
  const { start, stop } = useNfcReader();
71
74
 
75
+ // Enable Android reader mode (call once, typically at app startup)
76
+ nfcService.enableReaderMode_ANDROID(NfcAdapter.FLAG_READER_NFC_V);
77
+
72
78
  const begin = () => {
73
79
  start(
74
- NfcAdapter.FLAG_READER_NFC_V,
75
80
  (tag) => {
76
81
  console.log("Tag:", tag.id);
77
82
  },
78
- 1200
83
+ { cooldownMs: 1200 }
79
84
  );
80
85
  };
81
86
 
package/dist/index.d.mts CHANGED
@@ -112,18 +112,20 @@ declare class NfcService {
112
112
  private isProcessingTag;
113
113
  private currentOnTag?;
114
114
  private currentCooldownMs;
115
- private lastUsedReaderFlags;
115
+ private cooldownTimer?;
116
+ private readerModeFlags_ANDROID;
116
117
  constructor();
118
+ enableReaderMode_ANDROID(flags: number): void;
117
119
  private setState;
118
120
  getState(): NfcState;
119
121
  subscribe(fn: NfcListener): () => void;
120
- startReader(readerModeFlags: number, onTag?: (tag: TagEvent) => Promise<void> | void, options?: {
122
+ startReader(onTag?: (tag: TagEvent) => Promise<void> | void, options?: {
121
123
  cooldownMs?: number;
122
124
  }): Promise<void>;
123
125
  stopReader(): Promise<void>;
124
126
  private _resetReaderState;
125
- private _restartIosReader;
126
127
  withTechnology<T>(tech: NfcTech | NfcTech[], handler: () => Promise<T>): Promise<T>;
128
+ private withTechnologyReaderMode_ANDROID;
127
129
  }
128
130
  declare const nfcService: NfcService;
129
131
 
@@ -187,11 +189,10 @@ declare function useNfcContext(): NfcContextValue;
187
189
 
188
190
  declare function useNfc(onTag: (tagId: string) => void, options: {
189
191
  cooldownMs?: number;
190
- flags: number;
191
192
  }): void;
192
193
 
193
194
  declare function useNfcReader(): {
194
- start: (flags: number, onTag: (tag: TagEvent) => void, cooldownMs?: number) => void;
195
+ start: (onTag?: (tag: TagEvent) => Promise<void> | void, cooldownMs?: number) => void;
195
196
  stop: () => void;
196
197
  };
197
198
 
package/dist/index.d.ts CHANGED
@@ -112,18 +112,20 @@ declare class NfcService {
112
112
  private isProcessingTag;
113
113
  private currentOnTag?;
114
114
  private currentCooldownMs;
115
- private lastUsedReaderFlags;
115
+ private cooldownTimer?;
116
+ private readerModeFlags_ANDROID;
116
117
  constructor();
118
+ enableReaderMode_ANDROID(flags: number): void;
117
119
  private setState;
118
120
  getState(): NfcState;
119
121
  subscribe(fn: NfcListener): () => void;
120
- startReader(readerModeFlags: number, onTag?: (tag: TagEvent) => Promise<void> | void, options?: {
122
+ startReader(onTag?: (tag: TagEvent) => Promise<void> | void, options?: {
121
123
  cooldownMs?: number;
122
124
  }): Promise<void>;
123
125
  stopReader(): Promise<void>;
124
126
  private _resetReaderState;
125
- private _restartIosReader;
126
127
  withTechnology<T>(tech: NfcTech | NfcTech[], handler: () => Promise<T>): Promise<T>;
128
+ private withTechnologyReaderMode_ANDROID;
127
129
  }
128
130
  declare const nfcService: NfcService;
129
131
 
@@ -187,11 +189,10 @@ declare function useNfcContext(): NfcContextValue;
187
189
 
188
190
  declare function useNfc(onTag: (tagId: string) => void, options: {
189
191
  cooldownMs?: number;
190
- flags: number;
191
192
  }): void;
192
193
 
193
194
  declare function useNfcReader(): {
194
- start: (flags: number, onTag: (tag: TagEvent) => void, cooldownMs?: number) => void;
195
+ start: (onTag?: (tag: TagEvent) => Promise<void> | void, cooldownMs?: number) => void;
195
196
  stop: () => void;
196
197
  };
197
198
 
package/dist/index.js CHANGED
@@ -58,15 +58,18 @@ var import_react_native_nfc_manager2 = __toESM(require("react-native-nfc-manager
58
58
  var import_react_native = require("react-native");
59
59
  var import_react_native_nfc_manager = __toESM(require("react-native-nfc-manager"));
60
60
  var NfcService = class {
61
- // needed for iOS restart
62
61
  constructor() {
63
62
  this.state = { mode: "idle", tag: null };
64
63
  this.listeners = /* @__PURE__ */ new Set();
65
64
  this.isProcessingTag = false;
66
65
  this.currentCooldownMs = 1500;
67
- this.lastUsedReaderFlags = null;
66
+ this.readerModeFlags_ANDROID = null;
68
67
  import_react_native_nfc_manager.default.start();
69
68
  }
69
+ enableReaderMode_ANDROID(flags) {
70
+ if (import_react_native.Platform.OS !== "android") return;
71
+ this.readerModeFlags_ANDROID = flags;
72
+ }
70
73
  // -----------------------------
71
74
  // Internal state management
72
75
  // -----------------------------
@@ -85,9 +88,9 @@ var NfcService = class {
85
88
  };
86
89
  }
87
90
  // -----------------------------
88
- // START READER
91
+ // START READER (Soft Continuous Mode)
89
92
  // -----------------------------
90
- async startReader(readerModeFlags, onTag, options) {
93
+ async startReader(onTag, options) {
91
94
  var _a;
92
95
  if (this.state.mode !== "idle") {
93
96
  console.warn(`[NFC] Cannot start reader while ${this.state.mode}`);
@@ -95,39 +98,42 @@ var NfcService = class {
95
98
  }
96
99
  this.currentOnTag = onTag;
97
100
  this.currentCooldownMs = (_a = options == null ? void 0 : options.cooldownMs) != null ? _a : 1500;
98
- this.lastUsedReaderFlags = readerModeFlags;
99
101
  this.isProcessingTag = false;
100
102
  this.setState({ mode: "starting", tag: null });
101
103
  import_react_native_nfc_manager.default.setEventListener(
102
104
  import_react_native_nfc_manager.NfcEvents.DiscoverTag,
103
105
  async (tag) => {
106
+ var _a2;
104
107
  if (!tag) return;
105
108
  if (this.isProcessingTag) return;
106
109
  this.isProcessingTag = true;
107
110
  this.setState({ tag, mode: "active" });
108
111
  try {
109
- if (this.currentOnTag) {
110
- await this.currentOnTag(tag);
111
- }
112
+ await ((_a2 = this.currentOnTag) == null ? void 0 : _a2.call(this, tag));
112
113
  } catch (err) {
113
114
  console.warn("[NFC] onTag handler error:", err);
114
115
  } finally {
115
116
  const cooldown = this.currentCooldownMs;
116
- setTimeout(async () => {
117
+ if (this.cooldownTimer) {
118
+ clearTimeout(this.cooldownTimer);
119
+ }
120
+ this.cooldownTimer = setTimeout(() => {
117
121
  this.isProcessingTag = false;
118
- this.setState({ tag: null, mode: "active" });
119
- if (import_react_native.Platform.OS === "ios") {
120
- await this._restartIosReader();
121
- }
122
+ this.setState({ tag: null });
123
+ this.cooldownTimer = void 0;
122
124
  }, cooldown);
123
125
  }
124
126
  }
125
127
  );
126
128
  try {
127
- await import_react_native_nfc_manager.default.registerTagEvent({
128
- isReaderModeEnabled: true,
129
- readerModeFlags
130
- });
129
+ if (this.readerModeFlags_ANDROID) {
130
+ await import_react_native_nfc_manager.default.registerTagEvent({
131
+ isReaderModeEnabled: true,
132
+ readerModeFlags: this.readerModeFlags_ANDROID
133
+ });
134
+ } else {
135
+ await import_react_native_nfc_manager.default.registerTagEvent();
136
+ }
131
137
  if (this.state.mode === "starting") {
132
138
  this.setState({ mode: "active" });
133
139
  }
@@ -137,11 +143,17 @@ var NfcService = class {
137
143
  }
138
144
  }
139
145
  // -----------------------------
140
- // STOP READER
146
+ // STOP READER (explicit only)
141
147
  // -----------------------------
142
148
  async stopReader() {
143
149
  if (["idle", "stopping"].includes(this.state.mode)) return;
144
150
  this.setState({ mode: "stopping" });
151
+ import_react_native_nfc_manager.default.setEventListener(import_react_native_nfc_manager.NfcEvents.DiscoverTag, () => {
152
+ });
153
+ if (this.cooldownTimer) {
154
+ clearTimeout(this.cooldownTimer);
155
+ this.cooldownTimer = void 0;
156
+ }
145
157
  try {
146
158
  await import_react_native_nfc_manager.default.unregisterTagEvent();
147
159
  } catch (err) {
@@ -150,36 +162,34 @@ var NfcService = class {
150
162
  this._resetReaderState();
151
163
  }
152
164
  _resetReaderState() {
165
+ if (this.cooldownTimer) {
166
+ clearTimeout(this.cooldownTimer);
167
+ this.cooldownTimer = void 0;
168
+ }
153
169
  this.setState({ mode: "idle", tag: null });
154
170
  this.currentOnTag = void 0;
155
171
  this.isProcessingTag = false;
156
172
  }
157
173
  // -----------------------------
158
- // iOS RESTART
159
- // -----------------------------
160
- async _restartIosReader() {
161
- if (import_react_native.Platform.OS !== "ios") return;
162
- if (this.lastUsedReaderFlags == null) return;
163
- try {
164
- await import_react_native_nfc_manager.default.unregisterTagEvent();
165
- await import_react_native_nfc_manager.default.registerTagEvent({
166
- isReaderModeEnabled: true,
167
- readerModeFlags: this.lastUsedReaderFlags
168
- });
169
- this.setState({ mode: "active" });
170
- } catch (err) {
171
- console.warn("[NFC] iOS restart error:", err);
172
- this._resetReaderState();
173
- }
174
- }
175
- // -----------------------------
176
174
  // Technology sessions (NDEF, NfcV, etc.)
177
175
  // -----------------------------
178
176
  async withTechnology(tech, handler) {
179
177
  if (this.state.mode === "technology") {
180
178
  throw new Error("[NFC] Technology is already in use!");
181
179
  }
182
- if (["starting", "active", "stopping"].includes(this.state.mode)) {
180
+ if (this.readerModeFlags_ANDROID) {
181
+ return this.withTechnologyReaderMode_ANDROID(
182
+ tech,
183
+ handler,
184
+ this.readerModeFlags_ANDROID
185
+ );
186
+ }
187
+ const readerWasActive = ["starting", "active", "stopping"].includes(
188
+ this.state.mode
189
+ );
190
+ const savedOnTag = this.currentOnTag;
191
+ const savedCooldown = this.currentCooldownMs;
192
+ if (readerWasActive) {
183
193
  await this.stopReader();
184
194
  }
185
195
  if (this.state.mode !== "idle") {
@@ -187,7 +197,7 @@ var NfcService = class {
187
197
  `[NFC] Cannot start technology session in mode ${this.state.mode}`
188
198
  );
189
199
  }
190
- this.setState({ mode: "technology", tag: null });
200
+ this.setState({ mode: "technology" });
191
201
  try {
192
202
  await import_react_native_nfc_manager.default.requestTechnology(tech, {
193
203
  alertMessage: "Hold near NFC tag"
@@ -206,6 +216,42 @@ var NfcService = class {
206
216
  } catch {
207
217
  }
208
218
  this.setState({ mode: "idle", tag: null });
219
+ if (readerWasActive) {
220
+ try {
221
+ await this.startReader(savedOnTag, { cooldownMs: savedCooldown });
222
+ } catch (err) {
223
+ console.warn(
224
+ "[NFC] Failed to restart reader after tech session",
225
+ err
226
+ );
227
+ }
228
+ }
229
+ }
230
+ }
231
+ async withTechnologyReaderMode_ANDROID(tech, handler, flags) {
232
+ const readerWasActive = ["starting", "active", "stopping"].includes(
233
+ this.state.mode
234
+ );
235
+ this.isProcessingTag = true;
236
+ this.setState({ mode: "technology" });
237
+ try {
238
+ await import_react_native_nfc_manager.default.requestTechnology(tech, {
239
+ isReaderModeEnabled: true,
240
+ readerModeFlags: flags
241
+ });
242
+ return await handler();
243
+ } catch (err) {
244
+ const message = typeof err === "string" ? err : (err == null ? void 0 : err.message) || "Unknown NFC error";
245
+ throw new Error(
246
+ `[NFC] withTechnologyReaderMode_ANDROID error: ${message}`
247
+ );
248
+ } finally {
249
+ try {
250
+ await import_react_native_nfc_manager.default.cancelTechnologyRequest();
251
+ } catch {
252
+ }
253
+ this.isProcessingTag = false;
254
+ this.setState({ mode: readerWasActive ? "active" : "idle" });
209
255
  }
210
256
  }
211
257
  };
@@ -508,9 +554,7 @@ function useNfcContext() {
508
554
  var import_react2 = require("react");
509
555
  function useNfc(onTag, options) {
510
556
  (0, import_react2.useEffect)(() => {
511
- const flags = options.flags;
512
557
  nfcService.startReader(
513
- flags,
514
558
  async (tag) => {
515
559
  if (!tag.id) return;
516
560
  onTag(tag.id);
@@ -527,8 +571,8 @@ function useNfc(onTag, options) {
527
571
  var import_react3 = require("react");
528
572
  function useNfcReader() {
529
573
  const start = (0, import_react3.useCallback)(
530
- (flags, onTag, cooldownMs) => {
531
- nfcService.startReader(flags, onTag, { cooldownMs });
574
+ (onTag, cooldownMs) => {
575
+ nfcService.startReader(onTag, { cooldownMs });
532
576
  },
533
577
  []
534
578
  );
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/nfc/a/index.ts","../src/nfc/a/operations.ts","../src/nfc/service.ts","../src/nfc/a/utils.ts","../src/nfc/v/index.ts","../src/nfc/v/operations.ts","../src/nfc/v/internal.ts","../src/nfc/v/utils.ts","../src/nfc/ndef/index.ts","../src/nfc/ndef/operations.ts","../src/nfc/ndef/utils.ts","../src/nfc/namespace.ts","../src/react/nfc-provider.tsx","../src/react/use-nfc.ts","../src/react/use-nfc-reader.ts","../src/react/use-nfc-state.ts","../src/react/use-nfc-technology.ts"],"sourcesContent":["export * from \"./nfc\";\r\nexport * from \"./react\";\r\n","export { operations } from \"./operations\";\nexport { utils } from \"./utils\";\n","import NfcManager, { NfcTech } from \"react-native-nfc-manager\";\n\nimport { nfcService } from \"../service\";\n\nexport const operations = {\n async transceive(data: number[]) {\n return nfcService.withTechnology(NfcTech.NfcA, async () => {\n return await NfcManager.transceive(data);\n });\n },\n};\n","import { Platform } from \"react-native\";\nimport NfcManager, {\n NfcEvents,\n type NfcTech,\n type TagEvent,\n} from \"react-native-nfc-manager\";\n\nimport type { NfcMode, NfcState } from \"./types\";\n\nexport type NfcListener = (state: NfcState) => void;\n\nexport class NfcService {\n private state: NfcState = { mode: \"idle\", tag: null };\n private listeners = new Set<NfcListener>();\n\n private isProcessingTag = false;\n private currentOnTag?: (tag: TagEvent) => Promise<void> | void;\n private currentCooldownMs = 1500;\n private lastUsedReaderFlags: number | null = null; // needed for iOS restart\n\n constructor() {\n NfcManager.start();\n }\n\n // -----------------------------\n // Internal state management\n // -----------------------------\n private setState(partial: Partial<NfcState>) {\n this.state = { ...this.state, ...partial };\n for (const listener of this.listeners) listener(this.state);\n }\n\n getState() {\n return this.state;\n }\n\n subscribe(fn: NfcListener) {\n this.listeners.add(fn);\n fn(this.state);\n return () => {\n this.listeners.delete(fn); // ignore boolean\n };\n }\n\n // -----------------------------\n // START READER\n // -----------------------------\n async startReader(\n readerModeFlags: number,\n onTag?: (tag: TagEvent) => Promise<void> | void,\n options?: { cooldownMs?: number },\n ) {\n if (this.state.mode !== \"idle\") {\n console.warn(`[NFC] Cannot start reader while ${this.state.mode}`);\n return;\n }\n\n this.currentOnTag = onTag;\n this.currentCooldownMs = options?.cooldownMs ?? 1500;\n this.lastUsedReaderFlags = readerModeFlags;\n this.isProcessingTag = false;\n\n this.setState({ mode: \"starting\", tag: null });\n\n NfcManager.setEventListener(\n NfcEvents.DiscoverTag,\n async (tag: TagEvent) => {\n if (!tag) return;\n\n // Soft lock to avoid duplicate processing\n if (this.isProcessingTag) return;\n\n this.isProcessingTag = true;\n this.setState({ tag, mode: \"active\" });\n\n try {\n if (this.currentOnTag) {\n await this.currentOnTag(tag);\n }\n } catch (err) {\n console.warn(\"[NFC] onTag handler error:\", err);\n } finally {\n const cooldown = this.currentCooldownMs;\n\n setTimeout(async () => {\n this.isProcessingTag = false;\n this.setState({ tag: null, mode: \"active\" });\n\n // -----------------------------\n // iOS MUST restart reader\n // -----------------------------\n if (Platform.OS === \"ios\") {\n await this._restartIosReader();\n }\n }, cooldown);\n }\n },\n );\n\n try {\n await NfcManager.registerTagEvent({\n isReaderModeEnabled: true,\n readerModeFlags,\n });\n\n if ((this.state.mode as NfcMode) === \"starting\") {\n this.setState({ mode: \"active\" });\n }\n } catch (err) {\n console.warn(\"[NFC] startReader error:\", err);\n this._resetReaderState();\n }\n }\n\n // -----------------------------\n // STOP READER\n // -----------------------------\n async stopReader() {\n if ([\"idle\", \"stopping\"].includes(this.state.mode)) return;\n\n this.setState({ mode: \"stopping\" });\n\n try {\n await NfcManager.unregisterTagEvent();\n } catch (err) {\n console.warn(\"[NFC] unregisterTagEvent error:\", err);\n }\n\n this._resetReaderState();\n }\n\n private _resetReaderState() {\n this.setState({ mode: \"idle\", tag: null });\n this.currentOnTag = undefined;\n this.isProcessingTag = false;\n // keep lastUsedReaderFlags so iOS restart can keep using them\n }\n\n // -----------------------------\n // iOS RESTART\n // -----------------------------\n private async _restartIosReader() {\n if (Platform.OS !== \"ios\") return;\n if (this.lastUsedReaderFlags == null) return;\n\n try {\n await NfcManager.unregisterTagEvent();\n await NfcManager.registerTagEvent({\n isReaderModeEnabled: true,\n readerModeFlags: this.lastUsedReaderFlags,\n });\n\n this.setState({ mode: \"active\" });\n } catch (err) {\n console.warn(\"[NFC] iOS restart error:\", err);\n this._resetReaderState();\n }\n }\n\n // -----------------------------\n // Technology sessions (NDEF, NfcV, etc.)\n // -----------------------------\n async withTechnology<T>(\n tech: NfcTech | NfcTech[],\n handler: () => Promise<T>,\n ): Promise<T> {\n if (this.state.mode === \"technology\") {\n throw new Error(\"[NFC] Technology is already in use!\");\n }\n\n // Reader must be stopped for tech sessions\n if ([\"starting\", \"active\", \"stopping\"].includes(this.state.mode)) {\n await this.stopReader();\n }\n\n if (this.state.mode !== \"idle\") {\n throw new Error(\n `[NFC] Cannot start technology session in mode ${this.state.mode}`,\n );\n }\n\n this.setState({ mode: \"technology\", tag: null });\n\n try {\n await NfcManager.requestTechnology(tech, {\n alertMessage: \"Hold near NFC tag\",\n });\n\n const result = await handler();\n\n if (Platform.OS === \"ios\") {\n await NfcManager.setAlertMessageIOS(\"Success!\");\n }\n\n return result;\n } catch (err: any) {\n const message =\n typeof err === \"string\" ? err : err?.message || \"Unknown NFC error\";\n throw new Error(`[NFC] withTechnology error: ${message}`);\n } finally {\n try {\n await NfcManager.cancelTechnologyRequest();\n } catch {}\n\n this.setState({ mode: \"idle\", tag: null });\n }\n }\n}\n\n// Export one stable instance\nexport const nfcService = new NfcService();\n","export const utils = {};\n","export { operations } from \"./operations\";\nexport { utils } from \"./utils\";\n","import NfcManager from \"react-native-nfc-manager\";\n\nimport { nfcService } from \"../service\";\nimport {\n getSystemInfoRaw,\n readBlockRaw,\n type StrictTagEvent,\n writeBlockRaw,\n} from \"./internal\";\nimport { utils } from \"./utils\";\n\nexport const operations = {\n async withVTag<T>(handler: (tag: StrictTagEvent) => Promise<T>): Promise<T> {\n return nfcService.withTechnology(utils.tech, async () => {\n const tag = await NfcManager.getTag();\n if (!tag?.id) throw new Error(\"No NFC-V tag detected\");\n return handler(tag as StrictTagEvent);\n });\n },\n\n async writeBlockNfcV(blockNumber: number, data: Uint8Array) {\n return this.withVTag((tag) => writeBlockRaw(tag, blockNumber, data));\n },\n\n async readBlockNfcV(blockNumber: number) {\n return this.withVTag((tag) => readBlockRaw(tag, blockNumber));\n },\n\n async getSystemInfoNfcV() {\n return this.withVTag((tag) => getSystemInfoRaw(tag));\n },\n};\n","import NfcManager, { type TagEvent } from \"react-native-nfc-manager\";\n\nimport { utils } from \"./utils\";\n\nexport type StrictTagEvent = TagEvent & {\n id: string;\n};\n\nexport async function readBlockRaw(tag: StrictTagEvent, blockNumber: number) {\n const uid = utils.reverseUid(tag.id);\n const cmd = utils.buildReadBlock(uid, blockNumber);\n const resp = await NfcManager.transceive(cmd);\n return utils.parseReadResponse(resp);\n}\n\nexport async function writeBlockRaw(\n tag: StrictTagEvent,\n blockNumber: number,\n data: Uint8Array,\n) {\n const uid = utils.reverseUid(tag.id);\n const cmd = utils.buildWriteBlock(uid, blockNumber, data);\n const resp = await NfcManager.transceive(cmd);\n return utils.parseWriteResponse(resp);\n}\n\nexport async function getSystemInfoRaw(tag: StrictTagEvent) {\n const uid = utils.reverseUid(tag.id);\n const cmd = utils.buildGetSystemInfo(uid);\n const resp = await NfcManager.transceive(cmd);\n return utils.parseSystemInfo(resp);\n}\n","import { Platform } from \"react-native\";\nimport { NfcTech } from \"react-native-nfc-manager\";\n\n// Here's where things get REAL\n//\n// Only iPhone 7+ supports ISO15693; writing may require\n// requestTechnology([NfcTech.Iso15693]) and sometimes doesn’t allow raw\n// transceive (depends on firmware)\n//\n// | Byte | Meaning |\n// | ------------- | ---------------------------------------------------- |\n// | `0x02` | Flags (high data rate) |\n// | `0x20` | Flags (addressed) |\n// | `0x22` | Flags (0x02 + 0x20 = 0x22 addressed + high data rate)|\n// | `0x20` | Command code: Read Single Block |\n// | `0x21` | Command code: Write Single Block |\n// | `UID[0..7]` | Tag UID in reverse order (optional if not addressed) |\n// | `blockNumber` | Which memory block to write |\n// | `data[...]` | The bytes to write (block size usually 4 or 8 bytes) |\n//\n// Each command is a byte array\n// [ FLAGS, COMMAND_CODE, [UID bytes reversed], PARAMS... ]\n//\n// Tag response:\n// The tag response has this structure:\n//\n// | Byte | Meaning |\n// | ---- | --------------------------------------------- |\n// | `0` | **Status** (0x00 = success) |\n// | `1` | **Info Flags** |\n// | … | Data fields, conditional based on those flags |\n//\n// Info Flags bitmask:\n// | Bit | Hex | Meaning |\n// | --- | ---- | ------------------------------------------------------------- |\n// | 0 | 0x01 | DSFID present |\n// | 1 | 0x02 | AFI present |\n// | 2 | 0x04 | VICC memory size info present (number of blocks + block size) |\n// | 3 | 0x08 | IC reference present |\n// | 4–7 | — | RFU (reserved) |\n\nexport const utils = {\n tech: Platform.OS === \"ios\" ? [NfcTech.Iso15693IOS] : NfcTech.NfcV,\n\n Flags: {\n HIGH_DATA_RATE: 0x02,\n ADDRESSED: 0x20,\n // If needed later: OPTION: 0x40 (not commonly used)\n },\n\n Commands: {\n READ_SINGLE_BLOCK: 0x20,\n WRITE_SINGLE_BLOCK: 0x21,\n GET_SYSTEM_INFO: 0x2b,\n },\n\n /**\n * Combine multiple flag bits into one byte.\n * Example: Flags.ADDRESSED | Flags.HIGH_DATA_RATE\n */\n flags(...bits: number[]): number {\n return bits.reduce((acc, bit) => acc | bit, 0);\n },\n\n /**\n * Convert tag.id hex string (MSB->LSB) into reversed byte array (LSB->MSB)\n * ISO15693 requires reversed UID for addressed commands.\n */\n reverseUid(tagIdHex: string): number[] {\n const bytes = [];\n for (let i = 0; i < tagIdHex.length; i += 2) {\n bytes.unshift(Number.parseInt(tagIdHex.substring(i, i + 2), 16));\n }\n return bytes;\n },\n\n /**\n * Build READ_SINGLE_BLOCK command.\n * FLAGS: addressed + high data rate by default.\n */\n buildReadBlock(uidReversed: number[], blockNumber: number): number[] {\n const flags = this.flags(this.Flags.ADDRESSED, this.Flags.HIGH_DATA_RATE);\n return [\n flags,\n this.Commands.READ_SINGLE_BLOCK,\n ...uidReversed,\n blockNumber,\n ];\n },\n\n /**\n * Build WRITE_SINGLE_BLOCK command.\n * Note: data must match the block size (usually 4 or 8 bytes).\n */\n buildWriteBlock(\n uidReversed: number[],\n blockNumber: number,\n data: Uint8Array,\n ): number[] {\n const flags = this.flags(this.Flags.ADDRESSED, this.Flags.HIGH_DATA_RATE);\n return [\n flags,\n this.Commands.WRITE_SINGLE_BLOCK,\n ...uidReversed,\n blockNumber,\n ...data,\n ];\n },\n\n /**\n * Build GET_SYSTEM_INFO command.\n */\n buildGetSystemInfo(uidReversed: number[]): number[] {\n return [this.Flags.HIGH_DATA_RATE, this.Commands.GET_SYSTEM_INFO];\n },\n\n /**\n * Parse a READ_SINGLE_BLOCK response.\n * Response format:\n * - byte[0] = status (0x00 = success)\n * - byte[1..] = block payload bytes\n */\n parseReadResponse(resp: number[]): Uint8Array {\n if (!resp || resp.length === 0) {\n throw new Error(\"Empty NFC-V response\");\n }\n const status = resp[0];\n if (status === undefined) {\n throw new Error(\"Invalid NFC-V response: missing status byte\");\n }\n if (status !== 0x00) {\n throw new Error(`Read failed. Status: 0x${status.toString(16)}`);\n }\n return new Uint8Array(resp.slice(1));\n },\n\n /**\n * Parse WRITE_SINGLE_BLOCK response.\n * Successful write has resp[0] === 0x00.\n */\n parseWriteResponse(resp: number[]): void {\n if (!resp || resp.length === 0) {\n throw new Error(\"Empty NFC-V response\");\n }\n const status = resp[0];\n if (status === undefined) {\n throw new Error(\"Invalid NFC-V response: missing status byte\");\n }\n if (status !== 0x00) {\n throw new Error(`Write failed. Status: 0x${status.toString(16)}`);\n }\n },\n\n /**\n * Parse GET_SYSTEM_INFO response.\n * Returns: UID, DSFID, AFI, numberOfBlocks, blockSize, manufacturer\n */\n parseSystemInfo(resp: number[]) {\n if (!resp || resp.length < 2) {\n throw new Error(\"Invalid System Info response\");\n }\n const status = resp[0];\n if (status === undefined || status !== 0x00) {\n throw new Error(\"Invalid System Info response\");\n }\n const flagsByte = resp[1];\n if (flagsByte === undefined) {\n throw new Error(\"Invalid System Info response: missing flags byte\");\n }\n\n const infoFlags = flagsByte & 0x0f;\n let offset = 2;\n\n const result: any = {};\n\n // UID (always present – next 8 bytes)\n if (resp.length >= offset + 8) {\n const uidBytes = resp.slice(offset, offset + 8);\n result.uid = uidBytes\n .slice()\n .reverse()\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\")\n .toUpperCase();\n offset += 8;\n }\n\n // DSFID\n if (infoFlags & 0x01 && resp.length > offset) {\n result.dsfid = resp[offset++];\n }\n\n // AFI\n if (infoFlags & 0x02 && resp.length > offset) {\n result.afi = resp[offset++];\n }\n\n // Memory size info\n if (infoFlags & 0x04 && resp.length >= offset + 2) {\n const numBlocks = resp[offset++];\n const blkSize = resp[offset++];\n if (numBlocks !== undefined) {\n result.numberOfBlocks = numBlocks + 1;\n }\n if (blkSize !== undefined) {\n result.blockSize = blkSize + 1;\n }\n }\n\n // IC Reference\n if (infoFlags & 0x08 && resp.length > offset) {\n result.icReference = resp[offset++];\n }\n\n if (!result.blockSize) result.blockSize = 4; // default for EM Micro\n\n result.manufacturer = this.detectManufacturer(result.uid ?? \"\");\n\n return result;\n },\n\n /** Identify common manufacturers based on UID prefix */\n detectManufacturer(uid: string): string {\n if (\n uid.startsWith(\"E004\") ||\n uid.startsWith(\"E006\") ||\n uid.startsWith(\"E016\")\n )\n return \"EM Microelectronic\";\n if (uid.startsWith(\"E002\")) return \"STMicroelectronics\";\n if (uid.startsWith(\"E007\")) return \"Texas Instruments\";\n if (uid.startsWith(\"E010\")) return \"NXP\";\n return \"Unknown\";\n },\n} as const;\n","export { operations } from \"./operations\";\nexport { utils } from \"./utils\";\n","import NfcManager, {\n Ndef,\n type NdefRecord,\n NfcTech,\n} from \"react-native-nfc-manager\";\n\nimport { nfcService } from \"../service\";\n\nexport const operations = {\n async writeNdef(records: NdefRecord[]) {\n // Use NFC-A/Type 2 as fallback (often required on Android)\n await nfcService.withTechnology([NfcTech.Ndef, NfcTech.NfcA], async () => {\n const bytes = Ndef.encodeMessage(records);\n await NfcManager.ndefHandler.writeNdefMessage(bytes);\n });\n },\n\n writeTextNdef(text: string) {\n const record = Ndef.textRecord(text);\n return this.writeNdef([record]);\n },\n\n writeUriNdef(uri: string) {\n const record = Ndef.uriRecord(uri);\n return this.writeNdef([record]);\n },\n};\n","export const utils = {};\n","import { operations as aOps, utils as aUtils } from \"./a\";\nimport { operations as ndefOps, utils as ndefUtils } from \"./ndef\";\nimport { nfcService } from \"./service\";\nimport { operations as vOps, utils as vUtils } from \"./v\";\n/**\n * NFC root namespace providing access to:\n * - NfcService\n * - ISO15693 NFC-V ops\n * - NFC-A ops\n * - NDEF operations\n */\nexport const nfc = {\n service: nfcService,\n\n /** ISO15693 protocol helpers and high-level operations */\n v: {\n ...vOps, // NfcVOperations, nfcV\n utils: vUtils,\n },\n\n /** NFC-A / Type 2 helpers and operations */\n a: {\n ...aOps,\n utils: aUtils,\n },\n\n /** NDEF read/write utilities and operations */\n ndef: {\n ...ndefOps,\n utils: ndefUtils,\n },\n} as const;\n","import {\r\n createContext,\r\n type PropsWithChildren,\r\n useContext,\r\n useEffect,\r\n useState,\r\n} from \"react\";\r\n\r\nimport { nfcService } from \"../nfc/service\";\r\nimport type { NfcState } from \"../nfc/types\";\r\n\r\ninterface NfcContextValue {\r\n state: NfcState;\r\n service: typeof nfcService;\r\n}\r\n\r\nconst NfcContext = createContext<NfcContextValue | null>(null);\r\n\r\nexport function NfcProvider({ children }: PropsWithChildren) {\r\n const [state, setState] = useState(nfcService.getState());\r\n\r\n useEffect(() => {\r\n const unsubscribe = nfcService.subscribe(setState);\r\n return unsubscribe;\r\n }, []);\r\n\r\n return (\r\n <NfcContext.Provider value={{ state, service: nfcService }}>\r\n {children}\r\n </NfcContext.Provider>\r\n );\r\n}\r\n\r\nexport function useNfcContext() {\r\n const ctx = useContext(NfcContext);\r\n if (!ctx) throw new Error(\"useNfcContext must be inside <NfcProvider>\");\r\n return ctx;\r\n}\r\n","import { useEffect } from \"react\";\r\n\r\nimport { nfcService } from \"../nfc/service\";\r\n\r\nexport function useNfc(\r\n onTag: (tagId: string) => void,\r\n options: { cooldownMs?: number; flags: number },\r\n) {\r\n useEffect(() => {\r\n const flags = options.flags;\r\n\r\n nfcService.startReader(\r\n flags,\r\n async (tag) => {\r\n if (!tag.id) return;\r\n onTag(tag.id);\r\n },\r\n { cooldownMs: options?.cooldownMs },\r\n );\r\n\r\n return () => {\r\n nfcService.stopReader();\r\n };\r\n }, [onTag]);\r\n}\r\n","import { useCallback } from \"react\";\r\nimport type { TagEvent } from \"react-native-nfc-manager\";\r\n\r\nimport { nfcService } from \"../nfc/service\";\r\n\r\nexport function useNfcReader() {\r\n const start = useCallback(\r\n (flags: number, onTag: (tag: TagEvent) => void, cooldownMs?: number) => {\r\n nfcService.startReader(flags, onTag, { cooldownMs });\r\n },\r\n [],\r\n );\r\n\r\n const stop = useCallback(() => {\r\n nfcService.stopReader();\r\n }, []);\r\n\r\n return { start, stop };\r\n}\r\n","import { useEffect, useState } from \"react\";\n\nimport { nfcService } from \"../nfc\";\n\nexport function useNfcState() {\n const [nfcState, setNfcState] = useState(nfcService.getState());\n\n useEffect(() => nfcService.subscribe(setNfcState), []);\n\n return nfcState;\n}\n","import NfcManager, {\r\n Ndef,\r\n type NdefRecord,\r\n NfcTech,\r\n} from \"react-native-nfc-manager\";\r\n\r\nimport { nfcService } from \"../nfc/service\";\r\n\r\nexport function useNfcTechnology() {\r\n async function writeNdef(records: NdefRecord[]) {\r\n return nfcService.withTechnology(NfcTech.Ndef, async () => {\r\n const bytes = Ndef.encodeMessage(records);\r\n await NfcManager.ndefHandler.writeNdefMessage(bytes);\r\n });\r\n }\r\n\r\n async function runWithTech(\r\n tech: NfcTech | NfcTech[],\r\n fn: () => Promise<void>,\r\n ) {\r\n return nfcService.withTechnology(tech, fn);\r\n }\r\n\r\n return {\r\n writeNdef,\r\n runWithTech,\r\n };\r\n}\r\n"],"mappings":"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","names":["import_react_native_nfc_manager","NfcManager","NfcManager","operations","utils","import_react_native_nfc_manager","import_react_native_nfc_manager","import_react_native","import_react_native_nfc_manager","utils","utils","NfcManager","operations","utils","NfcManager","operations","utils","import_react_native_nfc_manager","operations","NfcManager","utils","operations","utils","import_react","import_react","import_react","import_react_native_nfc_manager","NfcManager"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/nfc/a/index.ts","../src/nfc/a/operations.ts","../src/nfc/service.ts","../src/nfc/a/utils.ts","../src/nfc/v/index.ts","../src/nfc/v/operations.ts","../src/nfc/v/internal.ts","../src/nfc/v/utils.ts","../src/nfc/ndef/index.ts","../src/nfc/ndef/operations.ts","../src/nfc/ndef/utils.ts","../src/nfc/namespace.ts","../src/react/nfc-provider.tsx","../src/react/use-nfc.ts","../src/react/use-nfc-reader.ts","../src/react/use-nfc-state.ts","../src/react/use-nfc-technology.ts"],"sourcesContent":["export * from \"./nfc\";\r\nexport * from \"./react\";\r\n","export { operations } from \"./operations\";\r\nexport { utils } from \"./utils\";\r\n","import NfcManager, { NfcTech } from \"react-native-nfc-manager\";\r\n\r\nimport { nfcService } from \"../service\";\r\n\r\nexport const operations = {\r\n async transceive(data: number[]) {\r\n return nfcService.withTechnology(NfcTech.NfcA, async () => {\r\n return await NfcManager.transceive(data);\r\n });\r\n },\r\n};\r\n","import { Platform } from \"react-native\";\r\nimport NfcManager, {\r\n NfcEvents,\r\n type NfcTech,\r\n type TagEvent,\r\n} from \"react-native-nfc-manager\";\r\n\r\nimport type { NfcMode, NfcState } from \"./types\";\r\n\r\nexport type NfcListener = (state: NfcState) => void;\r\n\r\nexport class NfcService {\r\n private state: NfcState = { mode: \"idle\", tag: null };\r\n private listeners = new Set<NfcListener>();\r\n\r\n private isProcessingTag = false;\r\n private currentOnTag?: (tag: TagEvent) => Promise<void> | void;\r\n private currentCooldownMs = 1500;\r\n private cooldownTimer?: ReturnType<typeof setTimeout>;\r\n\r\n private readerModeFlags_ANDROID: number | null = null;\r\n\r\n constructor() {\r\n NfcManager.start();\r\n }\r\n\r\n enableReaderMode_ANDROID(flags: number) {\r\n if (Platform.OS !== \"android\") return;\r\n this.readerModeFlags_ANDROID = flags;\r\n }\r\n\r\n // -----------------------------\r\n // Internal state management\r\n // -----------------------------\r\n private setState(partial: Partial<NfcState>) {\r\n this.state = { ...this.state, ...partial };\r\n for (const listener of this.listeners) listener(this.state);\r\n }\r\n\r\n getState() {\r\n return this.state;\r\n }\r\n\r\n subscribe(fn: NfcListener) {\r\n this.listeners.add(fn);\r\n fn(this.state); // emit immediately\r\n return () => {\r\n this.listeners.delete(fn);\r\n };\r\n }\r\n\r\n // -----------------------------\r\n // START READER (Soft Continuous Mode)\r\n // -----------------------------\r\n async startReader(\r\n onTag?: (tag: TagEvent) => Promise<void> | void,\r\n options?: { cooldownMs?: number },\r\n ) {\r\n if (this.state.mode !== \"idle\") {\r\n console.warn(`[NFC] Cannot start reader while ${this.state.mode}`);\r\n return;\r\n }\r\n\r\n this.currentOnTag = onTag;\r\n this.currentCooldownMs = options?.cooldownMs ?? 1500;\r\n this.isProcessingTag = false;\r\n\r\n this.setState({ mode: \"starting\", tag: null });\r\n\r\n // Tag listener\r\n NfcManager.setEventListener(\r\n NfcEvents.DiscoverTag,\r\n async (tag: TagEvent) => {\r\n if (!tag) return;\r\n\r\n // Prevent reprocessing until tag removed & cooldown completed\r\n if (this.isProcessingTag) return;\r\n\r\n this.isProcessingTag = true;\r\n this.setState({ tag, mode: \"active\" });\r\n\r\n try {\r\n await this.currentOnTag?.(tag);\r\n } catch (err) {\r\n console.warn(\"[NFC] onTag handler error:\", err);\r\n } finally {\r\n const cooldown = this.currentCooldownMs;\r\n\r\n // After cooldown, allow a new scan *only after tag is removed*\r\n if (this.cooldownTimer) {\r\n clearTimeout(this.cooldownTimer);\r\n }\r\n this.cooldownTimer = setTimeout(() => {\r\n this.isProcessingTag = false;\r\n this.setState({ tag: null });\r\n this.cooldownTimer = undefined;\r\n }, cooldown);\r\n }\r\n },\r\n );\r\n\r\n // Start reader\r\n try {\r\n if (this.readerModeFlags_ANDROID) {\r\n await NfcManager.registerTagEvent({\r\n isReaderModeEnabled: true,\r\n readerModeFlags: this.readerModeFlags_ANDROID,\r\n });\r\n } else {\r\n await NfcManager.registerTagEvent();\r\n }\r\n\r\n if ((this.state.mode as NfcMode) === \"starting\") {\r\n this.setState({ mode: \"active\" });\r\n }\r\n } catch (err) {\r\n console.warn(\"[NFC] startReader error:\", err);\r\n this._resetReaderState();\r\n }\r\n }\r\n\r\n // -----------------------------\r\n // STOP READER (explicit only)\r\n // -----------------------------\r\n async stopReader() {\r\n if ([\"idle\", \"stopping\"].includes(this.state.mode)) return;\r\n\r\n this.setState({ mode: \"stopping\" });\r\n // Ignore any late tag events while we tear down the reader\r\n NfcManager.setEventListener(NfcEvents.DiscoverTag, () => {});\r\n if (this.cooldownTimer) {\r\n clearTimeout(this.cooldownTimer);\r\n this.cooldownTimer = undefined;\r\n }\r\n\r\n try {\r\n await NfcManager.unregisterTagEvent();\r\n } catch (err) {\r\n console.warn(\"[NFC] unregisterTagEvent error:\", err);\r\n }\r\n\r\n this._resetReaderState();\r\n }\r\n\r\n private _resetReaderState() {\r\n if (this.cooldownTimer) {\r\n clearTimeout(this.cooldownTimer);\r\n this.cooldownTimer = undefined;\r\n }\r\n this.setState({ mode: \"idle\", tag: null });\r\n this.currentOnTag = undefined;\r\n this.isProcessingTag = false;\r\n }\r\n\r\n // -----------------------------\r\n // Technology sessions (NDEF, NfcV, etc.)\r\n // -----------------------------\r\n async withTechnology<T>(\r\n tech: NfcTech | NfcTech[],\r\n handler: () => Promise<T>,\r\n ): Promise<T> {\r\n if (this.state.mode === \"technology\") {\r\n throw new Error(\"[NFC] Technology is already in use!\");\r\n }\r\n\r\n if (this.readerModeFlags_ANDROID) {\r\n return this.withTechnologyReaderMode_ANDROID(\r\n tech,\r\n handler,\r\n this.readerModeFlags_ANDROID,\r\n );\r\n }\r\n\r\n // Stop reader before using tech session\r\n const readerWasActive = [\"starting\", \"active\", \"stopping\"].includes(\r\n this.state.mode,\r\n );\r\n const savedOnTag = this.currentOnTag;\r\n const savedCooldown = this.currentCooldownMs;\r\n\r\n if (readerWasActive) {\r\n await this.stopReader();\r\n }\r\n\r\n if (this.state.mode !== \"idle\") {\r\n throw new Error(\r\n `[NFC] Cannot start technology session in mode ${this.state.mode}`,\r\n );\r\n }\r\n\r\n this.setState({ mode: \"technology\" });\r\n\r\n try {\r\n await NfcManager.requestTechnology(tech, {\r\n alertMessage: \"Hold near NFC tag\",\r\n });\r\n\r\n const result = await handler();\r\n\r\n if (Platform.OS === \"ios\") {\r\n await NfcManager.setAlertMessageIOS(\"Success!\");\r\n }\r\n\r\n return result;\r\n } catch (err: any) {\r\n const message =\r\n typeof err === \"string\" ? err : err?.message || \"Unknown NFC error\";\r\n throw new Error(`[NFC] withTechnology error: ${message}`);\r\n } finally {\r\n try {\r\n await NfcManager.cancelTechnologyRequest();\r\n } catch {}\r\n\r\n this.setState({ mode: \"idle\", tag: null });\r\n\r\n // If reader was active before tech session, restart it automatically\r\n if (readerWasActive) {\r\n try {\r\n await this.startReader(savedOnTag, { cooldownMs: savedCooldown });\r\n } catch (err) {\r\n console.warn(\r\n \"[NFC] Failed to restart reader after tech session\",\r\n err,\r\n );\r\n }\r\n }\r\n }\r\n }\r\n\r\n private async withTechnologyReaderMode_ANDROID<T>(\r\n tech: NfcTech | NfcTech[],\r\n handler: () => Promise<T>,\r\n flags: number,\r\n ): Promise<T> {\r\n const readerWasActive = [\"starting\", \"active\", \"stopping\"].includes(\r\n this.state.mode,\r\n );\r\n\r\n // Keep reader mode active during tech request to avoid dispatch gap\r\n this.isProcessingTag = true;\r\n this.setState({ mode: \"technology\" });\r\n\r\n try {\r\n await NfcManager.requestTechnology(tech, {\r\n isReaderModeEnabled: true,\r\n readerModeFlags: flags,\r\n });\r\n\r\n return await handler();\r\n } catch (err: any) {\r\n const message =\r\n typeof err === \"string\" ? err : err?.message || \"Unknown NFC error\";\r\n throw new Error(\r\n `[NFC] withTechnologyReaderMode_ANDROID error: ${message}`,\r\n );\r\n } finally {\r\n try {\r\n await NfcManager.cancelTechnologyRequest();\r\n } catch {}\r\n\r\n this.isProcessingTag = false;\r\n this.setState({ mode: readerWasActive ? \"active\" : \"idle\" });\r\n }\r\n }\r\n}\r\n\r\n// Export singleton\r\nexport const nfcService = new NfcService();\r\n","export const utils = {};\r\n","export { operations } from \"./operations\";\r\nexport { utils } from \"./utils\";\r\n","import NfcManager from \"react-native-nfc-manager\";\r\n\r\nimport { nfcService } from \"../service\";\r\nimport {\r\n getSystemInfoRaw,\r\n readBlockRaw,\r\n type StrictTagEvent,\r\n writeBlockRaw,\r\n} from \"./internal\";\r\nimport { utils } from \"./utils\";\r\n\r\nexport const operations = {\r\n async withVTag<T>(handler: (tag: StrictTagEvent) => Promise<T>): Promise<T> {\r\n return nfcService.withTechnology(utils.tech, async () => {\r\n const tag = await NfcManager.getTag();\r\n if (!tag?.id) throw new Error(\"No NFC-V tag detected\");\r\n return handler(tag as StrictTagEvent);\r\n });\r\n },\r\n\r\n async writeBlockNfcV(blockNumber: number, data: Uint8Array) {\r\n return this.withVTag((tag) => writeBlockRaw(tag, blockNumber, data));\r\n },\r\n\r\n async readBlockNfcV(blockNumber: number) {\r\n return this.withVTag((tag) => readBlockRaw(tag, blockNumber));\r\n },\r\n\r\n async getSystemInfoNfcV() {\r\n return this.withVTag((tag) => getSystemInfoRaw(tag));\r\n },\r\n};\r\n","import NfcManager, { type TagEvent } from \"react-native-nfc-manager\";\r\n\r\nimport { utils } from \"./utils\";\r\n\r\nexport type StrictTagEvent = TagEvent & {\r\n id: string;\r\n};\r\n\r\nexport async function readBlockRaw(tag: StrictTagEvent, blockNumber: number) {\r\n const uid = utils.reverseUid(tag.id);\r\n const cmd = utils.buildReadBlock(uid, blockNumber);\r\n const resp = await NfcManager.transceive(cmd);\r\n return utils.parseReadResponse(resp);\r\n}\r\n\r\nexport async function writeBlockRaw(\r\n tag: StrictTagEvent,\r\n blockNumber: number,\r\n data: Uint8Array,\r\n) {\r\n const uid = utils.reverseUid(tag.id);\r\n const cmd = utils.buildWriteBlock(uid, blockNumber, data);\r\n const resp = await NfcManager.transceive(cmd);\r\n return utils.parseWriteResponse(resp);\r\n}\r\n\r\nexport async function getSystemInfoRaw(tag: StrictTagEvent) {\r\n const uid = utils.reverseUid(tag.id);\r\n const cmd = utils.buildGetSystemInfo(uid);\r\n const resp = await NfcManager.transceive(cmd);\r\n return utils.parseSystemInfo(resp);\r\n}\r\n","import { Platform } from \"react-native\";\r\nimport { NfcTech } from \"react-native-nfc-manager\";\r\n\r\n// Here's where things get REAL\r\n//\r\n// Only iPhone 7+ supports ISO15693; writing may require\r\n// requestTechnology([NfcTech.Iso15693]) and sometimes doesn’t allow raw\r\n// transceive (depends on firmware)\r\n//\r\n// | Byte | Meaning |\r\n// | ------------- | ---------------------------------------------------- |\r\n// | `0x02` | Flags (high data rate) |\r\n// | `0x20` | Flags (addressed) |\r\n// | `0x22` | Flags (0x02 + 0x20 = 0x22 addressed + high data rate)|\r\n// | `0x20` | Command code: Read Single Block |\r\n// | `0x21` | Command code: Write Single Block |\r\n// | `UID[0..7]` | Tag UID in reverse order (optional if not addressed) |\r\n// | `blockNumber` | Which memory block to write |\r\n// | `data[...]` | The bytes to write (block size usually 4 or 8 bytes) |\r\n//\r\n// Each command is a byte array\r\n// [ FLAGS, COMMAND_CODE, [UID bytes reversed], PARAMS... ]\r\n//\r\n// Tag response:\r\n// The tag response has this structure:\r\n//\r\n// | Byte | Meaning |\r\n// | ---- | --------------------------------------------- |\r\n// | `0` | **Status** (0x00 = success) |\r\n// | `1` | **Info Flags** |\r\n// | … | Data fields, conditional based on those flags |\r\n//\r\n// Info Flags bitmask:\r\n// | Bit | Hex | Meaning |\r\n// | --- | ---- | ------------------------------------------------------------- |\r\n// | 0 | 0x01 | DSFID present |\r\n// | 1 | 0x02 | AFI present |\r\n// | 2 | 0x04 | VICC memory size info present (number of blocks + block size) |\r\n// | 3 | 0x08 | IC reference present |\r\n// | 4–7 | — | RFU (reserved) |\r\n\r\nexport const utils = {\r\n tech: Platform.OS === \"ios\" ? [NfcTech.Iso15693IOS] : NfcTech.NfcV,\r\n\r\n Flags: {\r\n HIGH_DATA_RATE: 0x02,\r\n ADDRESSED: 0x20,\r\n // If needed later: OPTION: 0x40 (not commonly used)\r\n },\r\n\r\n Commands: {\r\n READ_SINGLE_BLOCK: 0x20,\r\n WRITE_SINGLE_BLOCK: 0x21,\r\n GET_SYSTEM_INFO: 0x2b,\r\n },\r\n\r\n /**\r\n * Combine multiple flag bits into one byte.\r\n * Example: Flags.ADDRESSED | Flags.HIGH_DATA_RATE\r\n */\r\n flags(...bits: number[]): number {\r\n return bits.reduce((acc, bit) => acc | bit, 0);\r\n },\r\n\r\n /**\r\n * Convert tag.id hex string (MSB->LSB) into reversed byte array (LSB->MSB)\r\n * ISO15693 requires reversed UID for addressed commands.\r\n */\r\n reverseUid(tagIdHex: string): number[] {\r\n const bytes = [];\r\n for (let i = 0; i < tagIdHex.length; i += 2) {\r\n bytes.unshift(Number.parseInt(tagIdHex.substring(i, i + 2), 16));\r\n }\r\n return bytes;\r\n },\r\n\r\n /**\r\n * Build READ_SINGLE_BLOCK command.\r\n * FLAGS: addressed + high data rate by default.\r\n */\r\n buildReadBlock(uidReversed: number[], blockNumber: number): number[] {\r\n const flags = this.flags(this.Flags.ADDRESSED, this.Flags.HIGH_DATA_RATE);\r\n return [\r\n flags,\r\n this.Commands.READ_SINGLE_BLOCK,\r\n ...uidReversed,\r\n blockNumber,\r\n ];\r\n },\r\n\r\n /**\r\n * Build WRITE_SINGLE_BLOCK command.\r\n * Note: data must match the block size (usually 4 or 8 bytes).\r\n */\r\n buildWriteBlock(\r\n uidReversed: number[],\r\n blockNumber: number,\r\n data: Uint8Array,\r\n ): number[] {\r\n const flags = this.flags(this.Flags.ADDRESSED, this.Flags.HIGH_DATA_RATE);\r\n return [\r\n flags,\r\n this.Commands.WRITE_SINGLE_BLOCK,\r\n ...uidReversed,\r\n blockNumber,\r\n ...data,\r\n ];\r\n },\r\n\r\n /**\r\n * Build GET_SYSTEM_INFO command.\r\n */\r\n buildGetSystemInfo(uidReversed: number[]): number[] {\r\n return [this.Flags.HIGH_DATA_RATE, this.Commands.GET_SYSTEM_INFO];\r\n },\r\n\r\n /**\r\n * Parse a READ_SINGLE_BLOCK response.\r\n * Response format:\r\n * - byte[0] = status (0x00 = success)\r\n * - byte[1..] = block payload bytes\r\n */\r\n parseReadResponse(resp: number[]): Uint8Array {\r\n if (!resp || resp.length === 0) {\r\n throw new Error(\"Empty NFC-V response\");\r\n }\r\n const status = resp[0];\r\n if (status === undefined) {\r\n throw new Error(\"Invalid NFC-V response: missing status byte\");\r\n }\r\n if (status !== 0x00) {\r\n throw new Error(`Read failed. Status: 0x${status.toString(16)}`);\r\n }\r\n return new Uint8Array(resp.slice(1));\r\n },\r\n\r\n /**\r\n * Parse WRITE_SINGLE_BLOCK response.\r\n * Successful write has resp[0] === 0x00.\r\n */\r\n parseWriteResponse(resp: number[]): void {\r\n if (!resp || resp.length === 0) {\r\n throw new Error(\"Empty NFC-V response\");\r\n }\r\n const status = resp[0];\r\n if (status === undefined) {\r\n throw new Error(\"Invalid NFC-V response: missing status byte\");\r\n }\r\n if (status !== 0x00) {\r\n throw new Error(`Write failed. Status: 0x${status.toString(16)}`);\r\n }\r\n },\r\n\r\n /**\r\n * Parse GET_SYSTEM_INFO response.\r\n * Returns: UID, DSFID, AFI, numberOfBlocks, blockSize, manufacturer\r\n */\r\n parseSystemInfo(resp: number[]) {\r\n if (!resp || resp.length < 2) {\r\n throw new Error(\"Invalid System Info response\");\r\n }\r\n const status = resp[0];\r\n if (status === undefined || status !== 0x00) {\r\n throw new Error(\"Invalid System Info response\");\r\n }\r\n const flagsByte = resp[1];\r\n if (flagsByte === undefined) {\r\n throw new Error(\"Invalid System Info response: missing flags byte\");\r\n }\r\n\r\n const infoFlags = flagsByte & 0x0f;\r\n let offset = 2;\r\n\r\n const result: any = {};\r\n\r\n // UID (always present – next 8 bytes)\r\n if (resp.length >= offset + 8) {\r\n const uidBytes = resp.slice(offset, offset + 8);\r\n result.uid = uidBytes\r\n .slice()\r\n .reverse()\r\n .map((b) => b.toString(16).padStart(2, \"0\"))\r\n .join(\"\")\r\n .toUpperCase();\r\n offset += 8;\r\n }\r\n\r\n // DSFID\r\n if (infoFlags & 0x01 && resp.length > offset) {\r\n result.dsfid = resp[offset++];\r\n }\r\n\r\n // AFI\r\n if (infoFlags & 0x02 && resp.length > offset) {\r\n result.afi = resp[offset++];\r\n }\r\n\r\n // Memory size info\r\n if (infoFlags & 0x04 && resp.length >= offset + 2) {\r\n const numBlocks = resp[offset++];\r\n const blkSize = resp[offset++];\r\n if (numBlocks !== undefined) {\r\n result.numberOfBlocks = numBlocks + 1;\r\n }\r\n if (blkSize !== undefined) {\r\n result.blockSize = blkSize + 1;\r\n }\r\n }\r\n\r\n // IC Reference\r\n if (infoFlags & 0x08 && resp.length > offset) {\r\n result.icReference = resp[offset++];\r\n }\r\n\r\n if (!result.blockSize) result.blockSize = 4; // default for EM Micro\r\n\r\n result.manufacturer = this.detectManufacturer(result.uid ?? \"\");\r\n\r\n return result;\r\n },\r\n\r\n /** Identify common manufacturers based on UID prefix */\r\n detectManufacturer(uid: string): string {\r\n if (\r\n uid.startsWith(\"E004\") ||\r\n uid.startsWith(\"E006\") ||\r\n uid.startsWith(\"E016\")\r\n )\r\n return \"EM Microelectronic\";\r\n if (uid.startsWith(\"E002\")) return \"STMicroelectronics\";\r\n if (uid.startsWith(\"E007\")) return \"Texas Instruments\";\r\n if (uid.startsWith(\"E010\")) return \"NXP\";\r\n return \"Unknown\";\r\n },\r\n} as const;\r\n","export { operations } from \"./operations\";\r\nexport { utils } from \"./utils\";\r\n","import NfcManager, {\r\n Ndef,\r\n type NdefRecord,\r\n NfcTech,\r\n} from \"react-native-nfc-manager\";\r\n\r\nimport { nfcService } from \"../service\";\r\n\r\nexport const operations = {\r\n async writeNdef(records: NdefRecord[]) {\r\n // Use NFC-A/Type 2 as fallback (often required on Android)\r\n await nfcService.withTechnology([NfcTech.Ndef, NfcTech.NfcA], async () => {\r\n const bytes = Ndef.encodeMessage(records);\r\n await NfcManager.ndefHandler.writeNdefMessage(bytes);\r\n });\r\n },\r\n\r\n writeTextNdef(text: string) {\r\n const record = Ndef.textRecord(text);\r\n return this.writeNdef([record]);\r\n },\r\n\r\n writeUriNdef(uri: string) {\r\n const record = Ndef.uriRecord(uri);\r\n return this.writeNdef([record]);\r\n },\r\n};\r\n","export const utils = {};\r\n","import { operations as aOps, utils as aUtils } from \"./a\";\r\nimport { operations as ndefOps, utils as ndefUtils } from \"./ndef\";\r\nimport { nfcService } from \"./service\";\r\nimport { operations as vOps, utils as vUtils } from \"./v\";\r\n/**\r\n * NFC root namespace providing access to:\r\n * - NfcService\r\n * - ISO15693 NFC-V ops\r\n * - NFC-A ops\r\n * - NDEF operations\r\n */\r\nexport const nfc = {\r\n service: nfcService,\r\n\r\n /** ISO15693 protocol helpers and high-level operations */\r\n v: {\r\n ...vOps, // NfcVOperations, nfcV\r\n utils: vUtils,\r\n },\r\n\r\n /** NFC-A / Type 2 helpers and operations */\r\n a: {\r\n ...aOps,\r\n utils: aUtils,\r\n },\r\n\r\n /** NDEF read/write utilities and operations */\r\n ndef: {\r\n ...ndefOps,\r\n utils: ndefUtils,\r\n },\r\n} as const;\r\n","import {\r\n createContext,\r\n type PropsWithChildren,\r\n useContext,\r\n useEffect,\r\n useState,\r\n} from \"react\";\r\n\r\nimport { nfcService } from \"../nfc/service\";\r\nimport type { NfcState } from \"../nfc/types\";\r\n\r\ninterface NfcContextValue {\r\n state: NfcState;\r\n service: typeof nfcService;\r\n}\r\n\r\nconst NfcContext = createContext<NfcContextValue | null>(null);\r\n\r\nexport function NfcProvider({ children }: PropsWithChildren) {\r\n const [state, setState] = useState(nfcService.getState());\r\n\r\n useEffect(() => {\r\n const unsubscribe = nfcService.subscribe(setState);\r\n return unsubscribe;\r\n }, []);\r\n\r\n return (\r\n <NfcContext.Provider value={{ state, service: nfcService }}>\r\n {children}\r\n </NfcContext.Provider>\r\n );\r\n}\r\n\r\nexport function useNfcContext() {\r\n const ctx = useContext(NfcContext);\r\n if (!ctx) throw new Error(\"useNfcContext must be inside <NfcProvider>\");\r\n return ctx;\r\n}\r\n","import { useEffect } from \"react\";\nimport type { TagEvent } from \"react-native-nfc-manager\";\n\nimport { nfcService } from \"../nfc/service\";\n\nexport function useNfc(\n onTag: (tagId: string) => void,\n options: { cooldownMs?: number },\n) {\n useEffect(() => {\n nfcService.startReader(\n async (tag: TagEvent) => {\n if (!tag.id) return;\n onTag(tag.id);\n },\n { cooldownMs: options?.cooldownMs },\n );\n\n return () => {\n nfcService.stopReader();\n };\n }, [onTag]);\n}\n","import { useCallback } from \"react\";\nimport type { TagEvent } from \"react-native-nfc-manager\";\n\nimport { nfcService } from \"../nfc/service\";\n\nexport function useNfcReader() {\n const start = useCallback(\n (onTag?: (tag: TagEvent) => Promise<void> | void, cooldownMs?: number) => {\n nfcService.startReader(onTag, { cooldownMs });\n },\n [],\n );\n\n const stop = useCallback(() => {\n nfcService.stopReader();\n }, []);\n\n return { start, stop };\n}\n","import { useEffect, useState } from \"react\";\r\n\r\nimport { nfcService } from \"../nfc\";\r\n\r\nexport function useNfcState() {\r\n const [nfcState, setNfcState] = useState(nfcService.getState());\r\n\r\n useEffect(() => nfcService.subscribe(setNfcState), []);\r\n\r\n return nfcState;\r\n}\r\n","import NfcManager, {\r\n Ndef,\r\n type NdefRecord,\r\n NfcTech,\r\n} from \"react-native-nfc-manager\";\r\n\r\nimport { nfcService } from \"../nfc/service\";\r\n\r\nexport function useNfcTechnology() {\r\n async function writeNdef(records: NdefRecord[]) {\r\n return nfcService.withTechnology(NfcTech.Ndef, async () => {\r\n const bytes = Ndef.encodeMessage(records);\r\n await NfcManager.ndefHandler.writeNdefMessage(bytes);\r\n });\r\n }\r\n\r\n async function runWithTech(\r\n tech: NfcTech | NfcTech[],\r\n fn: () => Promise<void>,\r\n ) {\r\n return nfcService.withTechnology(tech, fn);\r\n }\r\n\r\n return {\r\n writeNdef,\r\n runWithTech,\r\n };\r\n}\r\n"],"mappings":"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","names":["import_react_native_nfc_manager","NfcManager","_a","NfcManager","operations","utils","import_react_native_nfc_manager","import_react_native_nfc_manager","import_react_native","import_react_native_nfc_manager","utils","utils","NfcManager","operations","utils","NfcManager","operations","utils","import_react_native_nfc_manager","operations","NfcManager","utils","operations","utils","import_react","import_react","import_react","import_react_native_nfc_manager","NfcManager"]}
package/dist/index.mjs CHANGED
@@ -20,15 +20,18 @@ import NfcManager, {
20
20
  NfcEvents
21
21
  } from "react-native-nfc-manager";
22
22
  var NfcService = class {
23
- // needed for iOS restart
24
23
  constructor() {
25
24
  this.state = { mode: "idle", tag: null };
26
25
  this.listeners = /* @__PURE__ */ new Set();
27
26
  this.isProcessingTag = false;
28
27
  this.currentCooldownMs = 1500;
29
- this.lastUsedReaderFlags = null;
28
+ this.readerModeFlags_ANDROID = null;
30
29
  NfcManager.start();
31
30
  }
31
+ enableReaderMode_ANDROID(flags) {
32
+ if (Platform.OS !== "android") return;
33
+ this.readerModeFlags_ANDROID = flags;
34
+ }
32
35
  // -----------------------------
33
36
  // Internal state management
34
37
  // -----------------------------
@@ -47,9 +50,9 @@ var NfcService = class {
47
50
  };
48
51
  }
49
52
  // -----------------------------
50
- // START READER
53
+ // START READER (Soft Continuous Mode)
51
54
  // -----------------------------
52
- async startReader(readerModeFlags, onTag, options) {
55
+ async startReader(onTag, options) {
53
56
  var _a;
54
57
  if (this.state.mode !== "idle") {
55
58
  console.warn(`[NFC] Cannot start reader while ${this.state.mode}`);
@@ -57,39 +60,42 @@ var NfcService = class {
57
60
  }
58
61
  this.currentOnTag = onTag;
59
62
  this.currentCooldownMs = (_a = options == null ? void 0 : options.cooldownMs) != null ? _a : 1500;
60
- this.lastUsedReaderFlags = readerModeFlags;
61
63
  this.isProcessingTag = false;
62
64
  this.setState({ mode: "starting", tag: null });
63
65
  NfcManager.setEventListener(
64
66
  NfcEvents.DiscoverTag,
65
67
  async (tag) => {
68
+ var _a2;
66
69
  if (!tag) return;
67
70
  if (this.isProcessingTag) return;
68
71
  this.isProcessingTag = true;
69
72
  this.setState({ tag, mode: "active" });
70
73
  try {
71
- if (this.currentOnTag) {
72
- await this.currentOnTag(tag);
73
- }
74
+ await ((_a2 = this.currentOnTag) == null ? void 0 : _a2.call(this, tag));
74
75
  } catch (err) {
75
76
  console.warn("[NFC] onTag handler error:", err);
76
77
  } finally {
77
78
  const cooldown = this.currentCooldownMs;
78
- setTimeout(async () => {
79
+ if (this.cooldownTimer) {
80
+ clearTimeout(this.cooldownTimer);
81
+ }
82
+ this.cooldownTimer = setTimeout(() => {
79
83
  this.isProcessingTag = false;
80
- this.setState({ tag: null, mode: "active" });
81
- if (Platform.OS === "ios") {
82
- await this._restartIosReader();
83
- }
84
+ this.setState({ tag: null });
85
+ this.cooldownTimer = void 0;
84
86
  }, cooldown);
85
87
  }
86
88
  }
87
89
  );
88
90
  try {
89
- await NfcManager.registerTagEvent({
90
- isReaderModeEnabled: true,
91
- readerModeFlags
92
- });
91
+ if (this.readerModeFlags_ANDROID) {
92
+ await NfcManager.registerTagEvent({
93
+ isReaderModeEnabled: true,
94
+ readerModeFlags: this.readerModeFlags_ANDROID
95
+ });
96
+ } else {
97
+ await NfcManager.registerTagEvent();
98
+ }
93
99
  if (this.state.mode === "starting") {
94
100
  this.setState({ mode: "active" });
95
101
  }
@@ -99,11 +105,17 @@ var NfcService = class {
99
105
  }
100
106
  }
101
107
  // -----------------------------
102
- // STOP READER
108
+ // STOP READER (explicit only)
103
109
  // -----------------------------
104
110
  async stopReader() {
105
111
  if (["idle", "stopping"].includes(this.state.mode)) return;
106
112
  this.setState({ mode: "stopping" });
113
+ NfcManager.setEventListener(NfcEvents.DiscoverTag, () => {
114
+ });
115
+ if (this.cooldownTimer) {
116
+ clearTimeout(this.cooldownTimer);
117
+ this.cooldownTimer = void 0;
118
+ }
107
119
  try {
108
120
  await NfcManager.unregisterTagEvent();
109
121
  } catch (err) {
@@ -112,36 +124,34 @@ var NfcService = class {
112
124
  this._resetReaderState();
113
125
  }
114
126
  _resetReaderState() {
127
+ if (this.cooldownTimer) {
128
+ clearTimeout(this.cooldownTimer);
129
+ this.cooldownTimer = void 0;
130
+ }
115
131
  this.setState({ mode: "idle", tag: null });
116
132
  this.currentOnTag = void 0;
117
133
  this.isProcessingTag = false;
118
134
  }
119
135
  // -----------------------------
120
- // iOS RESTART
121
- // -----------------------------
122
- async _restartIosReader() {
123
- if (Platform.OS !== "ios") return;
124
- if (this.lastUsedReaderFlags == null) return;
125
- try {
126
- await NfcManager.unregisterTagEvent();
127
- await NfcManager.registerTagEvent({
128
- isReaderModeEnabled: true,
129
- readerModeFlags: this.lastUsedReaderFlags
130
- });
131
- this.setState({ mode: "active" });
132
- } catch (err) {
133
- console.warn("[NFC] iOS restart error:", err);
134
- this._resetReaderState();
135
- }
136
- }
137
- // -----------------------------
138
136
  // Technology sessions (NDEF, NfcV, etc.)
139
137
  // -----------------------------
140
138
  async withTechnology(tech, handler) {
141
139
  if (this.state.mode === "technology") {
142
140
  throw new Error("[NFC] Technology is already in use!");
143
141
  }
144
- if (["starting", "active", "stopping"].includes(this.state.mode)) {
142
+ if (this.readerModeFlags_ANDROID) {
143
+ return this.withTechnologyReaderMode_ANDROID(
144
+ tech,
145
+ handler,
146
+ this.readerModeFlags_ANDROID
147
+ );
148
+ }
149
+ const readerWasActive = ["starting", "active", "stopping"].includes(
150
+ this.state.mode
151
+ );
152
+ const savedOnTag = this.currentOnTag;
153
+ const savedCooldown = this.currentCooldownMs;
154
+ if (readerWasActive) {
145
155
  await this.stopReader();
146
156
  }
147
157
  if (this.state.mode !== "idle") {
@@ -149,7 +159,7 @@ var NfcService = class {
149
159
  `[NFC] Cannot start technology session in mode ${this.state.mode}`
150
160
  );
151
161
  }
152
- this.setState({ mode: "technology", tag: null });
162
+ this.setState({ mode: "technology" });
153
163
  try {
154
164
  await NfcManager.requestTechnology(tech, {
155
165
  alertMessage: "Hold near NFC tag"
@@ -168,6 +178,42 @@ var NfcService = class {
168
178
  } catch {
169
179
  }
170
180
  this.setState({ mode: "idle", tag: null });
181
+ if (readerWasActive) {
182
+ try {
183
+ await this.startReader(savedOnTag, { cooldownMs: savedCooldown });
184
+ } catch (err) {
185
+ console.warn(
186
+ "[NFC] Failed to restart reader after tech session",
187
+ err
188
+ );
189
+ }
190
+ }
191
+ }
192
+ }
193
+ async withTechnologyReaderMode_ANDROID(tech, handler, flags) {
194
+ const readerWasActive = ["starting", "active", "stopping"].includes(
195
+ this.state.mode
196
+ );
197
+ this.isProcessingTag = true;
198
+ this.setState({ mode: "technology" });
199
+ try {
200
+ await NfcManager.requestTechnology(tech, {
201
+ isReaderModeEnabled: true,
202
+ readerModeFlags: flags
203
+ });
204
+ return await handler();
205
+ } catch (err) {
206
+ const message = typeof err === "string" ? err : (err == null ? void 0 : err.message) || "Unknown NFC error";
207
+ throw new Error(
208
+ `[NFC] withTechnologyReaderMode_ANDROID error: ${message}`
209
+ );
210
+ } finally {
211
+ try {
212
+ await NfcManager.cancelTechnologyRequest();
213
+ } catch {
214
+ }
215
+ this.isProcessingTag = false;
216
+ this.setState({ mode: readerWasActive ? "active" : "idle" });
171
217
  }
172
218
  }
173
219
  };
@@ -478,9 +524,7 @@ function useNfcContext() {
478
524
  import { useEffect as useEffect2 } from "react";
479
525
  function useNfc(onTag, options) {
480
526
  useEffect2(() => {
481
- const flags = options.flags;
482
527
  nfcService.startReader(
483
- flags,
484
528
  async (tag) => {
485
529
  if (!tag.id) return;
486
530
  onTag(tag.id);
@@ -497,8 +541,8 @@ function useNfc(onTag, options) {
497
541
  import { useCallback } from "react";
498
542
  function useNfcReader() {
499
543
  const start = useCallback(
500
- (flags, onTag, cooldownMs) => {
501
- nfcService.startReader(flags, onTag, { cooldownMs });
544
+ (onTag, cooldownMs) => {
545
+ nfcService.startReader(onTag, { cooldownMs });
502
546
  },
503
547
  []
504
548
  );
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/nfc/a/index.ts","../src/nfc/a/operations.ts","../src/nfc/service.ts","../src/nfc/a/utils.ts","../src/nfc/v/index.ts","../src/nfc/v/operations.ts","../src/nfc/v/internal.ts","../src/nfc/v/utils.ts","../src/nfc/ndef/index.ts","../src/nfc/ndef/operations.ts","../src/nfc/ndef/utils.ts","../src/nfc/namespace.ts","../src/react/nfc-provider.tsx","../src/react/use-nfc.ts","../src/react/use-nfc-reader.ts","../src/react/use-nfc-state.ts","../src/react/use-nfc-technology.ts"],"sourcesContent":["export { operations } from \"./operations\";\nexport { utils } from \"./utils\";\n","import NfcManager, { NfcTech } from \"react-native-nfc-manager\";\n\nimport { nfcService } from \"../service\";\n\nexport const operations = {\n async transceive(data: number[]) {\n return nfcService.withTechnology(NfcTech.NfcA, async () => {\n return await NfcManager.transceive(data);\n });\n },\n};\n","import { Platform } from \"react-native\";\nimport NfcManager, {\n NfcEvents,\n type NfcTech,\n type TagEvent,\n} from \"react-native-nfc-manager\";\n\nimport type { NfcMode, NfcState } from \"./types\";\n\nexport type NfcListener = (state: NfcState) => void;\n\nexport class NfcService {\n private state: NfcState = { mode: \"idle\", tag: null };\n private listeners = new Set<NfcListener>();\n\n private isProcessingTag = false;\n private currentOnTag?: (tag: TagEvent) => Promise<void> | void;\n private currentCooldownMs = 1500;\n private lastUsedReaderFlags: number | null = null; // needed for iOS restart\n\n constructor() {\n NfcManager.start();\n }\n\n // -----------------------------\n // Internal state management\n // -----------------------------\n private setState(partial: Partial<NfcState>) {\n this.state = { ...this.state, ...partial };\n for (const listener of this.listeners) listener(this.state);\n }\n\n getState() {\n return this.state;\n }\n\n subscribe(fn: NfcListener) {\n this.listeners.add(fn);\n fn(this.state);\n return () => {\n this.listeners.delete(fn); // ignore boolean\n };\n }\n\n // -----------------------------\n // START READER\n // -----------------------------\n async startReader(\n readerModeFlags: number,\n onTag?: (tag: TagEvent) => Promise<void> | void,\n options?: { cooldownMs?: number },\n ) {\n if (this.state.mode !== \"idle\") {\n console.warn(`[NFC] Cannot start reader while ${this.state.mode}`);\n return;\n }\n\n this.currentOnTag = onTag;\n this.currentCooldownMs = options?.cooldownMs ?? 1500;\n this.lastUsedReaderFlags = readerModeFlags;\n this.isProcessingTag = false;\n\n this.setState({ mode: \"starting\", tag: null });\n\n NfcManager.setEventListener(\n NfcEvents.DiscoverTag,\n async (tag: TagEvent) => {\n if (!tag) return;\n\n // Soft lock to avoid duplicate processing\n if (this.isProcessingTag) return;\n\n this.isProcessingTag = true;\n this.setState({ tag, mode: \"active\" });\n\n try {\n if (this.currentOnTag) {\n await this.currentOnTag(tag);\n }\n } catch (err) {\n console.warn(\"[NFC] onTag handler error:\", err);\n } finally {\n const cooldown = this.currentCooldownMs;\n\n setTimeout(async () => {\n this.isProcessingTag = false;\n this.setState({ tag: null, mode: \"active\" });\n\n // -----------------------------\n // iOS MUST restart reader\n // -----------------------------\n if (Platform.OS === \"ios\") {\n await this._restartIosReader();\n }\n }, cooldown);\n }\n },\n );\n\n try {\n await NfcManager.registerTagEvent({\n isReaderModeEnabled: true,\n readerModeFlags,\n });\n\n if ((this.state.mode as NfcMode) === \"starting\") {\n this.setState({ mode: \"active\" });\n }\n } catch (err) {\n console.warn(\"[NFC] startReader error:\", err);\n this._resetReaderState();\n }\n }\n\n // -----------------------------\n // STOP READER\n // -----------------------------\n async stopReader() {\n if ([\"idle\", \"stopping\"].includes(this.state.mode)) return;\n\n this.setState({ mode: \"stopping\" });\n\n try {\n await NfcManager.unregisterTagEvent();\n } catch (err) {\n console.warn(\"[NFC] unregisterTagEvent error:\", err);\n }\n\n this._resetReaderState();\n }\n\n private _resetReaderState() {\n this.setState({ mode: \"idle\", tag: null });\n this.currentOnTag = undefined;\n this.isProcessingTag = false;\n // keep lastUsedReaderFlags so iOS restart can keep using them\n }\n\n // -----------------------------\n // iOS RESTART\n // -----------------------------\n private async _restartIosReader() {\n if (Platform.OS !== \"ios\") return;\n if (this.lastUsedReaderFlags == null) return;\n\n try {\n await NfcManager.unregisterTagEvent();\n await NfcManager.registerTagEvent({\n isReaderModeEnabled: true,\n readerModeFlags: this.lastUsedReaderFlags,\n });\n\n this.setState({ mode: \"active\" });\n } catch (err) {\n console.warn(\"[NFC] iOS restart error:\", err);\n this._resetReaderState();\n }\n }\n\n // -----------------------------\n // Technology sessions (NDEF, NfcV, etc.)\n // -----------------------------\n async withTechnology<T>(\n tech: NfcTech | NfcTech[],\n handler: () => Promise<T>,\n ): Promise<T> {\n if (this.state.mode === \"technology\") {\n throw new Error(\"[NFC] Technology is already in use!\");\n }\n\n // Reader must be stopped for tech sessions\n if ([\"starting\", \"active\", \"stopping\"].includes(this.state.mode)) {\n await this.stopReader();\n }\n\n if (this.state.mode !== \"idle\") {\n throw new Error(\n `[NFC] Cannot start technology session in mode ${this.state.mode}`,\n );\n }\n\n this.setState({ mode: \"technology\", tag: null });\n\n try {\n await NfcManager.requestTechnology(tech, {\n alertMessage: \"Hold near NFC tag\",\n });\n\n const result = await handler();\n\n if (Platform.OS === \"ios\") {\n await NfcManager.setAlertMessageIOS(\"Success!\");\n }\n\n return result;\n } catch (err: any) {\n const message =\n typeof err === \"string\" ? err : err?.message || \"Unknown NFC error\";\n throw new Error(`[NFC] withTechnology error: ${message}`);\n } finally {\n try {\n await NfcManager.cancelTechnologyRequest();\n } catch {}\n\n this.setState({ mode: \"idle\", tag: null });\n }\n }\n}\n\n// Export one stable instance\nexport const nfcService = new NfcService();\n","export const utils = {};\n","export { operations } from \"./operations\";\nexport { utils } from \"./utils\";\n","import NfcManager from \"react-native-nfc-manager\";\n\nimport { nfcService } from \"../service\";\nimport {\n getSystemInfoRaw,\n readBlockRaw,\n type StrictTagEvent,\n writeBlockRaw,\n} from \"./internal\";\nimport { utils } from \"./utils\";\n\nexport const operations = {\n async withVTag<T>(handler: (tag: StrictTagEvent) => Promise<T>): Promise<T> {\n return nfcService.withTechnology(utils.tech, async () => {\n const tag = await NfcManager.getTag();\n if (!tag?.id) throw new Error(\"No NFC-V tag detected\");\n return handler(tag as StrictTagEvent);\n });\n },\n\n async writeBlockNfcV(blockNumber: number, data: Uint8Array) {\n return this.withVTag((tag) => writeBlockRaw(tag, blockNumber, data));\n },\n\n async readBlockNfcV(blockNumber: number) {\n return this.withVTag((tag) => readBlockRaw(tag, blockNumber));\n },\n\n async getSystemInfoNfcV() {\n return this.withVTag((tag) => getSystemInfoRaw(tag));\n },\n};\n","import NfcManager, { type TagEvent } from \"react-native-nfc-manager\";\n\nimport { utils } from \"./utils\";\n\nexport type StrictTagEvent = TagEvent & {\n id: string;\n};\n\nexport async function readBlockRaw(tag: StrictTagEvent, blockNumber: number) {\n const uid = utils.reverseUid(tag.id);\n const cmd = utils.buildReadBlock(uid, blockNumber);\n const resp = await NfcManager.transceive(cmd);\n return utils.parseReadResponse(resp);\n}\n\nexport async function writeBlockRaw(\n tag: StrictTagEvent,\n blockNumber: number,\n data: Uint8Array,\n) {\n const uid = utils.reverseUid(tag.id);\n const cmd = utils.buildWriteBlock(uid, blockNumber, data);\n const resp = await NfcManager.transceive(cmd);\n return utils.parseWriteResponse(resp);\n}\n\nexport async function getSystemInfoRaw(tag: StrictTagEvent) {\n const uid = utils.reverseUid(tag.id);\n const cmd = utils.buildGetSystemInfo(uid);\n const resp = await NfcManager.transceive(cmd);\n return utils.parseSystemInfo(resp);\n}\n","import { Platform } from \"react-native\";\nimport { NfcTech } from \"react-native-nfc-manager\";\n\n// Here's where things get REAL\n//\n// Only iPhone 7+ supports ISO15693; writing may require\n// requestTechnology([NfcTech.Iso15693]) and sometimes doesn’t allow raw\n// transceive (depends on firmware)\n//\n// | Byte | Meaning |\n// | ------------- | ---------------------------------------------------- |\n// | `0x02` | Flags (high data rate) |\n// | `0x20` | Flags (addressed) |\n// | `0x22` | Flags (0x02 + 0x20 = 0x22 addressed + high data rate)|\n// | `0x20` | Command code: Read Single Block |\n// | `0x21` | Command code: Write Single Block |\n// | `UID[0..7]` | Tag UID in reverse order (optional if not addressed) |\n// | `blockNumber` | Which memory block to write |\n// | `data[...]` | The bytes to write (block size usually 4 or 8 bytes) |\n//\n// Each command is a byte array\n// [ FLAGS, COMMAND_CODE, [UID bytes reversed], PARAMS... ]\n//\n// Tag response:\n// The tag response has this structure:\n//\n// | Byte | Meaning |\n// | ---- | --------------------------------------------- |\n// | `0` | **Status** (0x00 = success) |\n// | `1` | **Info Flags** |\n// | … | Data fields, conditional based on those flags |\n//\n// Info Flags bitmask:\n// | Bit | Hex | Meaning |\n// | --- | ---- | ------------------------------------------------------------- |\n// | 0 | 0x01 | DSFID present |\n// | 1 | 0x02 | AFI present |\n// | 2 | 0x04 | VICC memory size info present (number of blocks + block size) |\n// | 3 | 0x08 | IC reference present |\n// | 4–7 | — | RFU (reserved) |\n\nexport const utils = {\n tech: Platform.OS === \"ios\" ? [NfcTech.Iso15693IOS] : NfcTech.NfcV,\n\n Flags: {\n HIGH_DATA_RATE: 0x02,\n ADDRESSED: 0x20,\n // If needed later: OPTION: 0x40 (not commonly used)\n },\n\n Commands: {\n READ_SINGLE_BLOCK: 0x20,\n WRITE_SINGLE_BLOCK: 0x21,\n GET_SYSTEM_INFO: 0x2b,\n },\n\n /**\n * Combine multiple flag bits into one byte.\n * Example: Flags.ADDRESSED | Flags.HIGH_DATA_RATE\n */\n flags(...bits: number[]): number {\n return bits.reduce((acc, bit) => acc | bit, 0);\n },\n\n /**\n * Convert tag.id hex string (MSB->LSB) into reversed byte array (LSB->MSB)\n * ISO15693 requires reversed UID for addressed commands.\n */\n reverseUid(tagIdHex: string): number[] {\n const bytes = [];\n for (let i = 0; i < tagIdHex.length; i += 2) {\n bytes.unshift(Number.parseInt(tagIdHex.substring(i, i + 2), 16));\n }\n return bytes;\n },\n\n /**\n * Build READ_SINGLE_BLOCK command.\n * FLAGS: addressed + high data rate by default.\n */\n buildReadBlock(uidReversed: number[], blockNumber: number): number[] {\n const flags = this.flags(this.Flags.ADDRESSED, this.Flags.HIGH_DATA_RATE);\n return [\n flags,\n this.Commands.READ_SINGLE_BLOCK,\n ...uidReversed,\n blockNumber,\n ];\n },\n\n /**\n * Build WRITE_SINGLE_BLOCK command.\n * Note: data must match the block size (usually 4 or 8 bytes).\n */\n buildWriteBlock(\n uidReversed: number[],\n blockNumber: number,\n data: Uint8Array,\n ): number[] {\n const flags = this.flags(this.Flags.ADDRESSED, this.Flags.HIGH_DATA_RATE);\n return [\n flags,\n this.Commands.WRITE_SINGLE_BLOCK,\n ...uidReversed,\n blockNumber,\n ...data,\n ];\n },\n\n /**\n * Build GET_SYSTEM_INFO command.\n */\n buildGetSystemInfo(uidReversed: number[]): number[] {\n return [this.Flags.HIGH_DATA_RATE, this.Commands.GET_SYSTEM_INFO];\n },\n\n /**\n * Parse a READ_SINGLE_BLOCK response.\n * Response format:\n * - byte[0] = status (0x00 = success)\n * - byte[1..] = block payload bytes\n */\n parseReadResponse(resp: number[]): Uint8Array {\n if (!resp || resp.length === 0) {\n throw new Error(\"Empty NFC-V response\");\n }\n const status = resp[0];\n if (status === undefined) {\n throw new Error(\"Invalid NFC-V response: missing status byte\");\n }\n if (status !== 0x00) {\n throw new Error(`Read failed. Status: 0x${status.toString(16)}`);\n }\n return new Uint8Array(resp.slice(1));\n },\n\n /**\n * Parse WRITE_SINGLE_BLOCK response.\n * Successful write has resp[0] === 0x00.\n */\n parseWriteResponse(resp: number[]): void {\n if (!resp || resp.length === 0) {\n throw new Error(\"Empty NFC-V response\");\n }\n const status = resp[0];\n if (status === undefined) {\n throw new Error(\"Invalid NFC-V response: missing status byte\");\n }\n if (status !== 0x00) {\n throw new Error(`Write failed. Status: 0x${status.toString(16)}`);\n }\n },\n\n /**\n * Parse GET_SYSTEM_INFO response.\n * Returns: UID, DSFID, AFI, numberOfBlocks, blockSize, manufacturer\n */\n parseSystemInfo(resp: number[]) {\n if (!resp || resp.length < 2) {\n throw new Error(\"Invalid System Info response\");\n }\n const status = resp[0];\n if (status === undefined || status !== 0x00) {\n throw new Error(\"Invalid System Info response\");\n }\n const flagsByte = resp[1];\n if (flagsByte === undefined) {\n throw new Error(\"Invalid System Info response: missing flags byte\");\n }\n\n const infoFlags = flagsByte & 0x0f;\n let offset = 2;\n\n const result: any = {};\n\n // UID (always present – next 8 bytes)\n if (resp.length >= offset + 8) {\n const uidBytes = resp.slice(offset, offset + 8);\n result.uid = uidBytes\n .slice()\n .reverse()\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\")\n .toUpperCase();\n offset += 8;\n }\n\n // DSFID\n if (infoFlags & 0x01 && resp.length > offset) {\n result.dsfid = resp[offset++];\n }\n\n // AFI\n if (infoFlags & 0x02 && resp.length > offset) {\n result.afi = resp[offset++];\n }\n\n // Memory size info\n if (infoFlags & 0x04 && resp.length >= offset + 2) {\n const numBlocks = resp[offset++];\n const blkSize = resp[offset++];\n if (numBlocks !== undefined) {\n result.numberOfBlocks = numBlocks + 1;\n }\n if (blkSize !== undefined) {\n result.blockSize = blkSize + 1;\n }\n }\n\n // IC Reference\n if (infoFlags & 0x08 && resp.length > offset) {\n result.icReference = resp[offset++];\n }\n\n if (!result.blockSize) result.blockSize = 4; // default for EM Micro\n\n result.manufacturer = this.detectManufacturer(result.uid ?? \"\");\n\n return result;\n },\n\n /** Identify common manufacturers based on UID prefix */\n detectManufacturer(uid: string): string {\n if (\n uid.startsWith(\"E004\") ||\n uid.startsWith(\"E006\") ||\n uid.startsWith(\"E016\")\n )\n return \"EM Microelectronic\";\n if (uid.startsWith(\"E002\")) return \"STMicroelectronics\";\n if (uid.startsWith(\"E007\")) return \"Texas Instruments\";\n if (uid.startsWith(\"E010\")) return \"NXP\";\n return \"Unknown\";\n },\n} as const;\n","export { operations } from \"./operations\";\nexport { utils } from \"./utils\";\n","import NfcManager, {\n Ndef,\n type NdefRecord,\n NfcTech,\n} from \"react-native-nfc-manager\";\n\nimport { nfcService } from \"../service\";\n\nexport const operations = {\n async writeNdef(records: NdefRecord[]) {\n // Use NFC-A/Type 2 as fallback (often required on Android)\n await nfcService.withTechnology([NfcTech.Ndef, NfcTech.NfcA], async () => {\n const bytes = Ndef.encodeMessage(records);\n await NfcManager.ndefHandler.writeNdefMessage(bytes);\n });\n },\n\n writeTextNdef(text: string) {\n const record = Ndef.textRecord(text);\n return this.writeNdef([record]);\n },\n\n writeUriNdef(uri: string) {\n const record = Ndef.uriRecord(uri);\n return this.writeNdef([record]);\n },\n};\n","export const utils = {};\n","import { operations as aOps, utils as aUtils } from \"./a\";\nimport { operations as ndefOps, utils as ndefUtils } from \"./ndef\";\nimport { nfcService } from \"./service\";\nimport { operations as vOps, utils as vUtils } from \"./v\";\n/**\n * NFC root namespace providing access to:\n * - NfcService\n * - ISO15693 NFC-V ops\n * - NFC-A ops\n * - NDEF operations\n */\nexport const nfc = {\n service: nfcService,\n\n /** ISO15693 protocol helpers and high-level operations */\n v: {\n ...vOps, // NfcVOperations, nfcV\n utils: vUtils,\n },\n\n /** NFC-A / Type 2 helpers and operations */\n a: {\n ...aOps,\n utils: aUtils,\n },\n\n /** NDEF read/write utilities and operations */\n ndef: {\n ...ndefOps,\n utils: ndefUtils,\n },\n} as const;\n","import {\r\n createContext,\r\n type PropsWithChildren,\r\n useContext,\r\n useEffect,\r\n useState,\r\n} from \"react\";\r\n\r\nimport { nfcService } from \"../nfc/service\";\r\nimport type { NfcState } from \"../nfc/types\";\r\n\r\ninterface NfcContextValue {\r\n state: NfcState;\r\n service: typeof nfcService;\r\n}\r\n\r\nconst NfcContext = createContext<NfcContextValue | null>(null);\r\n\r\nexport function NfcProvider({ children }: PropsWithChildren) {\r\n const [state, setState] = useState(nfcService.getState());\r\n\r\n useEffect(() => {\r\n const unsubscribe = nfcService.subscribe(setState);\r\n return unsubscribe;\r\n }, []);\r\n\r\n return (\r\n <NfcContext.Provider value={{ state, service: nfcService }}>\r\n {children}\r\n </NfcContext.Provider>\r\n );\r\n}\r\n\r\nexport function useNfcContext() {\r\n const ctx = useContext(NfcContext);\r\n if (!ctx) throw new Error(\"useNfcContext must be inside <NfcProvider>\");\r\n return ctx;\r\n}\r\n","import { useEffect } from \"react\";\r\n\r\nimport { nfcService } from \"../nfc/service\";\r\n\r\nexport function useNfc(\r\n onTag: (tagId: string) => void,\r\n options: { cooldownMs?: number; flags: number },\r\n) {\r\n useEffect(() => {\r\n const flags = options.flags;\r\n\r\n nfcService.startReader(\r\n flags,\r\n async (tag) => {\r\n if (!tag.id) return;\r\n onTag(tag.id);\r\n },\r\n { cooldownMs: options?.cooldownMs },\r\n );\r\n\r\n return () => {\r\n nfcService.stopReader();\r\n };\r\n }, [onTag]);\r\n}\r\n","import { useCallback } from \"react\";\r\nimport type { TagEvent } from \"react-native-nfc-manager\";\r\n\r\nimport { nfcService } from \"../nfc/service\";\r\n\r\nexport function useNfcReader() {\r\n const start = useCallback(\r\n (flags: number, onTag: (tag: TagEvent) => void, cooldownMs?: number) => {\r\n nfcService.startReader(flags, onTag, { cooldownMs });\r\n },\r\n [],\r\n );\r\n\r\n const stop = useCallback(() => {\r\n nfcService.stopReader();\r\n }, []);\r\n\r\n return { start, stop };\r\n}\r\n","import { useEffect, useState } from \"react\";\n\nimport { nfcService } from \"../nfc\";\n\nexport function useNfcState() {\n const [nfcState, setNfcState] = useState(nfcService.getState());\n\n useEffect(() => nfcService.subscribe(setNfcState), []);\n\n return nfcState;\n}\n","import NfcManager, {\r\n Ndef,\r\n type NdefRecord,\r\n NfcTech,\r\n} from \"react-native-nfc-manager\";\r\n\r\nimport { nfcService } from \"../nfc/service\";\r\n\r\nexport function useNfcTechnology() {\r\n async function writeNdef(records: NdefRecord[]) {\r\n return nfcService.withTechnology(NfcTech.Ndef, async () => {\r\n const bytes = Ndef.encodeMessage(records);\r\n await NfcManager.ndefHandler.writeNdefMessage(bytes);\r\n });\r\n }\r\n\r\n async function runWithTech(\r\n tech: NfcTech | NfcTech[],\r\n fn: () => Promise<void>,\r\n ) {\r\n return nfcService.withTechnology(tech, fn);\r\n }\r\n\r\n return {\r\n writeNdef,\r\n runWithTech,\r\n };\r\n}\r\n"],"mappings":"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","names":["NfcManager","NfcManager","operations","utils","NfcManager","NfcManager","Platform","NfcTech","utils","utils","NfcManager","operations","utils","NfcManager","operations","utils","NfcManager","NfcTech","operations","NfcTech","NfcManager","utils","operations","utils","useEffect","useEffect","useEffect","useState","useState","useEffect","NfcManager","Ndef","NfcTech","NfcTech","Ndef","NfcManager"]}
1
+ {"version":3,"sources":["../src/nfc/a/index.ts","../src/nfc/a/operations.ts","../src/nfc/service.ts","../src/nfc/a/utils.ts","../src/nfc/v/index.ts","../src/nfc/v/operations.ts","../src/nfc/v/internal.ts","../src/nfc/v/utils.ts","../src/nfc/ndef/index.ts","../src/nfc/ndef/operations.ts","../src/nfc/ndef/utils.ts","../src/nfc/namespace.ts","../src/react/nfc-provider.tsx","../src/react/use-nfc.ts","../src/react/use-nfc-reader.ts","../src/react/use-nfc-state.ts","../src/react/use-nfc-technology.ts"],"sourcesContent":["export { operations } from \"./operations\";\r\nexport { utils } from \"./utils\";\r\n","import NfcManager, { NfcTech } from \"react-native-nfc-manager\";\r\n\r\nimport { nfcService } from \"../service\";\r\n\r\nexport const operations = {\r\n async transceive(data: number[]) {\r\n return nfcService.withTechnology(NfcTech.NfcA, async () => {\r\n return await NfcManager.transceive(data);\r\n });\r\n },\r\n};\r\n","import { Platform } from \"react-native\";\r\nimport NfcManager, {\r\n NfcEvents,\r\n type NfcTech,\r\n type TagEvent,\r\n} from \"react-native-nfc-manager\";\r\n\r\nimport type { NfcMode, NfcState } from \"./types\";\r\n\r\nexport type NfcListener = (state: NfcState) => void;\r\n\r\nexport class NfcService {\r\n private state: NfcState = { mode: \"idle\", tag: null };\r\n private listeners = new Set<NfcListener>();\r\n\r\n private isProcessingTag = false;\r\n private currentOnTag?: (tag: TagEvent) => Promise<void> | void;\r\n private currentCooldownMs = 1500;\r\n private cooldownTimer?: ReturnType<typeof setTimeout>;\r\n\r\n private readerModeFlags_ANDROID: number | null = null;\r\n\r\n constructor() {\r\n NfcManager.start();\r\n }\r\n\r\n enableReaderMode_ANDROID(flags: number) {\r\n if (Platform.OS !== \"android\") return;\r\n this.readerModeFlags_ANDROID = flags;\r\n }\r\n\r\n // -----------------------------\r\n // Internal state management\r\n // -----------------------------\r\n private setState(partial: Partial<NfcState>) {\r\n this.state = { ...this.state, ...partial };\r\n for (const listener of this.listeners) listener(this.state);\r\n }\r\n\r\n getState() {\r\n return this.state;\r\n }\r\n\r\n subscribe(fn: NfcListener) {\r\n this.listeners.add(fn);\r\n fn(this.state); // emit immediately\r\n return () => {\r\n this.listeners.delete(fn);\r\n };\r\n }\r\n\r\n // -----------------------------\r\n // START READER (Soft Continuous Mode)\r\n // -----------------------------\r\n async startReader(\r\n onTag?: (tag: TagEvent) => Promise<void> | void,\r\n options?: { cooldownMs?: number },\r\n ) {\r\n if (this.state.mode !== \"idle\") {\r\n console.warn(`[NFC] Cannot start reader while ${this.state.mode}`);\r\n return;\r\n }\r\n\r\n this.currentOnTag = onTag;\r\n this.currentCooldownMs = options?.cooldownMs ?? 1500;\r\n this.isProcessingTag = false;\r\n\r\n this.setState({ mode: \"starting\", tag: null });\r\n\r\n // Tag listener\r\n NfcManager.setEventListener(\r\n NfcEvents.DiscoverTag,\r\n async (tag: TagEvent) => {\r\n if (!tag) return;\r\n\r\n // Prevent reprocessing until tag removed & cooldown completed\r\n if (this.isProcessingTag) return;\r\n\r\n this.isProcessingTag = true;\r\n this.setState({ tag, mode: \"active\" });\r\n\r\n try {\r\n await this.currentOnTag?.(tag);\r\n } catch (err) {\r\n console.warn(\"[NFC] onTag handler error:\", err);\r\n } finally {\r\n const cooldown = this.currentCooldownMs;\r\n\r\n // After cooldown, allow a new scan *only after tag is removed*\r\n if (this.cooldownTimer) {\r\n clearTimeout(this.cooldownTimer);\r\n }\r\n this.cooldownTimer = setTimeout(() => {\r\n this.isProcessingTag = false;\r\n this.setState({ tag: null });\r\n this.cooldownTimer = undefined;\r\n }, cooldown);\r\n }\r\n },\r\n );\r\n\r\n // Start reader\r\n try {\r\n if (this.readerModeFlags_ANDROID) {\r\n await NfcManager.registerTagEvent({\r\n isReaderModeEnabled: true,\r\n readerModeFlags: this.readerModeFlags_ANDROID,\r\n });\r\n } else {\r\n await NfcManager.registerTagEvent();\r\n }\r\n\r\n if ((this.state.mode as NfcMode) === \"starting\") {\r\n this.setState({ mode: \"active\" });\r\n }\r\n } catch (err) {\r\n console.warn(\"[NFC] startReader error:\", err);\r\n this._resetReaderState();\r\n }\r\n }\r\n\r\n // -----------------------------\r\n // STOP READER (explicit only)\r\n // -----------------------------\r\n async stopReader() {\r\n if ([\"idle\", \"stopping\"].includes(this.state.mode)) return;\r\n\r\n this.setState({ mode: \"stopping\" });\r\n // Ignore any late tag events while we tear down the reader\r\n NfcManager.setEventListener(NfcEvents.DiscoverTag, () => {});\r\n if (this.cooldownTimer) {\r\n clearTimeout(this.cooldownTimer);\r\n this.cooldownTimer = undefined;\r\n }\r\n\r\n try {\r\n await NfcManager.unregisterTagEvent();\r\n } catch (err) {\r\n console.warn(\"[NFC] unregisterTagEvent error:\", err);\r\n }\r\n\r\n this._resetReaderState();\r\n }\r\n\r\n private _resetReaderState() {\r\n if (this.cooldownTimer) {\r\n clearTimeout(this.cooldownTimer);\r\n this.cooldownTimer = undefined;\r\n }\r\n this.setState({ mode: \"idle\", tag: null });\r\n this.currentOnTag = undefined;\r\n this.isProcessingTag = false;\r\n }\r\n\r\n // -----------------------------\r\n // Technology sessions (NDEF, NfcV, etc.)\r\n // -----------------------------\r\n async withTechnology<T>(\r\n tech: NfcTech | NfcTech[],\r\n handler: () => Promise<T>,\r\n ): Promise<T> {\r\n if (this.state.mode === \"technology\") {\r\n throw new Error(\"[NFC] Technology is already in use!\");\r\n }\r\n\r\n if (this.readerModeFlags_ANDROID) {\r\n return this.withTechnologyReaderMode_ANDROID(\r\n tech,\r\n handler,\r\n this.readerModeFlags_ANDROID,\r\n );\r\n }\r\n\r\n // Stop reader before using tech session\r\n const readerWasActive = [\"starting\", \"active\", \"stopping\"].includes(\r\n this.state.mode,\r\n );\r\n const savedOnTag = this.currentOnTag;\r\n const savedCooldown = this.currentCooldownMs;\r\n\r\n if (readerWasActive) {\r\n await this.stopReader();\r\n }\r\n\r\n if (this.state.mode !== \"idle\") {\r\n throw new Error(\r\n `[NFC] Cannot start technology session in mode ${this.state.mode}`,\r\n );\r\n }\r\n\r\n this.setState({ mode: \"technology\" });\r\n\r\n try {\r\n await NfcManager.requestTechnology(tech, {\r\n alertMessage: \"Hold near NFC tag\",\r\n });\r\n\r\n const result = await handler();\r\n\r\n if (Platform.OS === \"ios\") {\r\n await NfcManager.setAlertMessageIOS(\"Success!\");\r\n }\r\n\r\n return result;\r\n } catch (err: any) {\r\n const message =\r\n typeof err === \"string\" ? err : err?.message || \"Unknown NFC error\";\r\n throw new Error(`[NFC] withTechnology error: ${message}`);\r\n } finally {\r\n try {\r\n await NfcManager.cancelTechnologyRequest();\r\n } catch {}\r\n\r\n this.setState({ mode: \"idle\", tag: null });\r\n\r\n // If reader was active before tech session, restart it automatically\r\n if (readerWasActive) {\r\n try {\r\n await this.startReader(savedOnTag, { cooldownMs: savedCooldown });\r\n } catch (err) {\r\n console.warn(\r\n \"[NFC] Failed to restart reader after tech session\",\r\n err,\r\n );\r\n }\r\n }\r\n }\r\n }\r\n\r\n private async withTechnologyReaderMode_ANDROID<T>(\r\n tech: NfcTech | NfcTech[],\r\n handler: () => Promise<T>,\r\n flags: number,\r\n ): Promise<T> {\r\n const readerWasActive = [\"starting\", \"active\", \"stopping\"].includes(\r\n this.state.mode,\r\n );\r\n\r\n // Keep reader mode active during tech request to avoid dispatch gap\r\n this.isProcessingTag = true;\r\n this.setState({ mode: \"technology\" });\r\n\r\n try {\r\n await NfcManager.requestTechnology(tech, {\r\n isReaderModeEnabled: true,\r\n readerModeFlags: flags,\r\n });\r\n\r\n return await handler();\r\n } catch (err: any) {\r\n const message =\r\n typeof err === \"string\" ? err : err?.message || \"Unknown NFC error\";\r\n throw new Error(\r\n `[NFC] withTechnologyReaderMode_ANDROID error: ${message}`,\r\n );\r\n } finally {\r\n try {\r\n await NfcManager.cancelTechnologyRequest();\r\n } catch {}\r\n\r\n this.isProcessingTag = false;\r\n this.setState({ mode: readerWasActive ? \"active\" : \"idle\" });\r\n }\r\n }\r\n}\r\n\r\n// Export singleton\r\nexport const nfcService = new NfcService();\r\n","export const utils = {};\r\n","export { operations } from \"./operations\";\r\nexport { utils } from \"./utils\";\r\n","import NfcManager from \"react-native-nfc-manager\";\r\n\r\nimport { nfcService } from \"../service\";\r\nimport {\r\n getSystemInfoRaw,\r\n readBlockRaw,\r\n type StrictTagEvent,\r\n writeBlockRaw,\r\n} from \"./internal\";\r\nimport { utils } from \"./utils\";\r\n\r\nexport const operations = {\r\n async withVTag<T>(handler: (tag: StrictTagEvent) => Promise<T>): Promise<T> {\r\n return nfcService.withTechnology(utils.tech, async () => {\r\n const tag = await NfcManager.getTag();\r\n if (!tag?.id) throw new Error(\"No NFC-V tag detected\");\r\n return handler(tag as StrictTagEvent);\r\n });\r\n },\r\n\r\n async writeBlockNfcV(blockNumber: number, data: Uint8Array) {\r\n return this.withVTag((tag) => writeBlockRaw(tag, blockNumber, data));\r\n },\r\n\r\n async readBlockNfcV(blockNumber: number) {\r\n return this.withVTag((tag) => readBlockRaw(tag, blockNumber));\r\n },\r\n\r\n async getSystemInfoNfcV() {\r\n return this.withVTag((tag) => getSystemInfoRaw(tag));\r\n },\r\n};\r\n","import NfcManager, { type TagEvent } from \"react-native-nfc-manager\";\r\n\r\nimport { utils } from \"./utils\";\r\n\r\nexport type StrictTagEvent = TagEvent & {\r\n id: string;\r\n};\r\n\r\nexport async function readBlockRaw(tag: StrictTagEvent, blockNumber: number) {\r\n const uid = utils.reverseUid(tag.id);\r\n const cmd = utils.buildReadBlock(uid, blockNumber);\r\n const resp = await NfcManager.transceive(cmd);\r\n return utils.parseReadResponse(resp);\r\n}\r\n\r\nexport async function writeBlockRaw(\r\n tag: StrictTagEvent,\r\n blockNumber: number,\r\n data: Uint8Array,\r\n) {\r\n const uid = utils.reverseUid(tag.id);\r\n const cmd = utils.buildWriteBlock(uid, blockNumber, data);\r\n const resp = await NfcManager.transceive(cmd);\r\n return utils.parseWriteResponse(resp);\r\n}\r\n\r\nexport async function getSystemInfoRaw(tag: StrictTagEvent) {\r\n const uid = utils.reverseUid(tag.id);\r\n const cmd = utils.buildGetSystemInfo(uid);\r\n const resp = await NfcManager.transceive(cmd);\r\n return utils.parseSystemInfo(resp);\r\n}\r\n","import { Platform } from \"react-native\";\r\nimport { NfcTech } from \"react-native-nfc-manager\";\r\n\r\n// Here's where things get REAL\r\n//\r\n// Only iPhone 7+ supports ISO15693; writing may require\r\n// requestTechnology([NfcTech.Iso15693]) and sometimes doesn’t allow raw\r\n// transceive (depends on firmware)\r\n//\r\n// | Byte | Meaning |\r\n// | ------------- | ---------------------------------------------------- |\r\n// | `0x02` | Flags (high data rate) |\r\n// | `0x20` | Flags (addressed) |\r\n// | `0x22` | Flags (0x02 + 0x20 = 0x22 addressed + high data rate)|\r\n// | `0x20` | Command code: Read Single Block |\r\n// | `0x21` | Command code: Write Single Block |\r\n// | `UID[0..7]` | Tag UID in reverse order (optional if not addressed) |\r\n// | `blockNumber` | Which memory block to write |\r\n// | `data[...]` | The bytes to write (block size usually 4 or 8 bytes) |\r\n//\r\n// Each command is a byte array\r\n// [ FLAGS, COMMAND_CODE, [UID bytes reversed], PARAMS... ]\r\n//\r\n// Tag response:\r\n// The tag response has this structure:\r\n//\r\n// | Byte | Meaning |\r\n// | ---- | --------------------------------------------- |\r\n// | `0` | **Status** (0x00 = success) |\r\n// | `1` | **Info Flags** |\r\n// | … | Data fields, conditional based on those flags |\r\n//\r\n// Info Flags bitmask:\r\n// | Bit | Hex | Meaning |\r\n// | --- | ---- | ------------------------------------------------------------- |\r\n// | 0 | 0x01 | DSFID present |\r\n// | 1 | 0x02 | AFI present |\r\n// | 2 | 0x04 | VICC memory size info present (number of blocks + block size) |\r\n// | 3 | 0x08 | IC reference present |\r\n// | 4–7 | — | RFU (reserved) |\r\n\r\nexport const utils = {\r\n tech: Platform.OS === \"ios\" ? [NfcTech.Iso15693IOS] : NfcTech.NfcV,\r\n\r\n Flags: {\r\n HIGH_DATA_RATE: 0x02,\r\n ADDRESSED: 0x20,\r\n // If needed later: OPTION: 0x40 (not commonly used)\r\n },\r\n\r\n Commands: {\r\n READ_SINGLE_BLOCK: 0x20,\r\n WRITE_SINGLE_BLOCK: 0x21,\r\n GET_SYSTEM_INFO: 0x2b,\r\n },\r\n\r\n /**\r\n * Combine multiple flag bits into one byte.\r\n * Example: Flags.ADDRESSED | Flags.HIGH_DATA_RATE\r\n */\r\n flags(...bits: number[]): number {\r\n return bits.reduce((acc, bit) => acc | bit, 0);\r\n },\r\n\r\n /**\r\n * Convert tag.id hex string (MSB->LSB) into reversed byte array (LSB->MSB)\r\n * ISO15693 requires reversed UID for addressed commands.\r\n */\r\n reverseUid(tagIdHex: string): number[] {\r\n const bytes = [];\r\n for (let i = 0; i < tagIdHex.length; i += 2) {\r\n bytes.unshift(Number.parseInt(tagIdHex.substring(i, i + 2), 16));\r\n }\r\n return bytes;\r\n },\r\n\r\n /**\r\n * Build READ_SINGLE_BLOCK command.\r\n * FLAGS: addressed + high data rate by default.\r\n */\r\n buildReadBlock(uidReversed: number[], blockNumber: number): number[] {\r\n const flags = this.flags(this.Flags.ADDRESSED, this.Flags.HIGH_DATA_RATE);\r\n return [\r\n flags,\r\n this.Commands.READ_SINGLE_BLOCK,\r\n ...uidReversed,\r\n blockNumber,\r\n ];\r\n },\r\n\r\n /**\r\n * Build WRITE_SINGLE_BLOCK command.\r\n * Note: data must match the block size (usually 4 or 8 bytes).\r\n */\r\n buildWriteBlock(\r\n uidReversed: number[],\r\n blockNumber: number,\r\n data: Uint8Array,\r\n ): number[] {\r\n const flags = this.flags(this.Flags.ADDRESSED, this.Flags.HIGH_DATA_RATE);\r\n return [\r\n flags,\r\n this.Commands.WRITE_SINGLE_BLOCK,\r\n ...uidReversed,\r\n blockNumber,\r\n ...data,\r\n ];\r\n },\r\n\r\n /**\r\n * Build GET_SYSTEM_INFO command.\r\n */\r\n buildGetSystemInfo(uidReversed: number[]): number[] {\r\n return [this.Flags.HIGH_DATA_RATE, this.Commands.GET_SYSTEM_INFO];\r\n },\r\n\r\n /**\r\n * Parse a READ_SINGLE_BLOCK response.\r\n * Response format:\r\n * - byte[0] = status (0x00 = success)\r\n * - byte[1..] = block payload bytes\r\n */\r\n parseReadResponse(resp: number[]): Uint8Array {\r\n if (!resp || resp.length === 0) {\r\n throw new Error(\"Empty NFC-V response\");\r\n }\r\n const status = resp[0];\r\n if (status === undefined) {\r\n throw new Error(\"Invalid NFC-V response: missing status byte\");\r\n }\r\n if (status !== 0x00) {\r\n throw new Error(`Read failed. Status: 0x${status.toString(16)}`);\r\n }\r\n return new Uint8Array(resp.slice(1));\r\n },\r\n\r\n /**\r\n * Parse WRITE_SINGLE_BLOCK response.\r\n * Successful write has resp[0] === 0x00.\r\n */\r\n parseWriteResponse(resp: number[]): void {\r\n if (!resp || resp.length === 0) {\r\n throw new Error(\"Empty NFC-V response\");\r\n }\r\n const status = resp[0];\r\n if (status === undefined) {\r\n throw new Error(\"Invalid NFC-V response: missing status byte\");\r\n }\r\n if (status !== 0x00) {\r\n throw new Error(`Write failed. Status: 0x${status.toString(16)}`);\r\n }\r\n },\r\n\r\n /**\r\n * Parse GET_SYSTEM_INFO response.\r\n * Returns: UID, DSFID, AFI, numberOfBlocks, blockSize, manufacturer\r\n */\r\n parseSystemInfo(resp: number[]) {\r\n if (!resp || resp.length < 2) {\r\n throw new Error(\"Invalid System Info response\");\r\n }\r\n const status = resp[0];\r\n if (status === undefined || status !== 0x00) {\r\n throw new Error(\"Invalid System Info response\");\r\n }\r\n const flagsByte = resp[1];\r\n if (flagsByte === undefined) {\r\n throw new Error(\"Invalid System Info response: missing flags byte\");\r\n }\r\n\r\n const infoFlags = flagsByte & 0x0f;\r\n let offset = 2;\r\n\r\n const result: any = {};\r\n\r\n // UID (always present – next 8 bytes)\r\n if (resp.length >= offset + 8) {\r\n const uidBytes = resp.slice(offset, offset + 8);\r\n result.uid = uidBytes\r\n .slice()\r\n .reverse()\r\n .map((b) => b.toString(16).padStart(2, \"0\"))\r\n .join(\"\")\r\n .toUpperCase();\r\n offset += 8;\r\n }\r\n\r\n // DSFID\r\n if (infoFlags & 0x01 && resp.length > offset) {\r\n result.dsfid = resp[offset++];\r\n }\r\n\r\n // AFI\r\n if (infoFlags & 0x02 && resp.length > offset) {\r\n result.afi = resp[offset++];\r\n }\r\n\r\n // Memory size info\r\n if (infoFlags & 0x04 && resp.length >= offset + 2) {\r\n const numBlocks = resp[offset++];\r\n const blkSize = resp[offset++];\r\n if (numBlocks !== undefined) {\r\n result.numberOfBlocks = numBlocks + 1;\r\n }\r\n if (blkSize !== undefined) {\r\n result.blockSize = blkSize + 1;\r\n }\r\n }\r\n\r\n // IC Reference\r\n if (infoFlags & 0x08 && resp.length > offset) {\r\n result.icReference = resp[offset++];\r\n }\r\n\r\n if (!result.blockSize) result.blockSize = 4; // default for EM Micro\r\n\r\n result.manufacturer = this.detectManufacturer(result.uid ?? \"\");\r\n\r\n return result;\r\n },\r\n\r\n /** Identify common manufacturers based on UID prefix */\r\n detectManufacturer(uid: string): string {\r\n if (\r\n uid.startsWith(\"E004\") ||\r\n uid.startsWith(\"E006\") ||\r\n uid.startsWith(\"E016\")\r\n )\r\n return \"EM Microelectronic\";\r\n if (uid.startsWith(\"E002\")) return \"STMicroelectronics\";\r\n if (uid.startsWith(\"E007\")) return \"Texas Instruments\";\r\n if (uid.startsWith(\"E010\")) return \"NXP\";\r\n return \"Unknown\";\r\n },\r\n} as const;\r\n","export { operations } from \"./operations\";\r\nexport { utils } from \"./utils\";\r\n","import NfcManager, {\r\n Ndef,\r\n type NdefRecord,\r\n NfcTech,\r\n} from \"react-native-nfc-manager\";\r\n\r\nimport { nfcService } from \"../service\";\r\n\r\nexport const operations = {\r\n async writeNdef(records: NdefRecord[]) {\r\n // Use NFC-A/Type 2 as fallback (often required on Android)\r\n await nfcService.withTechnology([NfcTech.Ndef, NfcTech.NfcA], async () => {\r\n const bytes = Ndef.encodeMessage(records);\r\n await NfcManager.ndefHandler.writeNdefMessage(bytes);\r\n });\r\n },\r\n\r\n writeTextNdef(text: string) {\r\n const record = Ndef.textRecord(text);\r\n return this.writeNdef([record]);\r\n },\r\n\r\n writeUriNdef(uri: string) {\r\n const record = Ndef.uriRecord(uri);\r\n return this.writeNdef([record]);\r\n },\r\n};\r\n","export const utils = {};\r\n","import { operations as aOps, utils as aUtils } from \"./a\";\r\nimport { operations as ndefOps, utils as ndefUtils } from \"./ndef\";\r\nimport { nfcService } from \"./service\";\r\nimport { operations as vOps, utils as vUtils } from \"./v\";\r\n/**\r\n * NFC root namespace providing access to:\r\n * - NfcService\r\n * - ISO15693 NFC-V ops\r\n * - NFC-A ops\r\n * - NDEF operations\r\n */\r\nexport const nfc = {\r\n service: nfcService,\r\n\r\n /** ISO15693 protocol helpers and high-level operations */\r\n v: {\r\n ...vOps, // NfcVOperations, nfcV\r\n utils: vUtils,\r\n },\r\n\r\n /** NFC-A / Type 2 helpers and operations */\r\n a: {\r\n ...aOps,\r\n utils: aUtils,\r\n },\r\n\r\n /** NDEF read/write utilities and operations */\r\n ndef: {\r\n ...ndefOps,\r\n utils: ndefUtils,\r\n },\r\n} as const;\r\n","import {\r\n createContext,\r\n type PropsWithChildren,\r\n useContext,\r\n useEffect,\r\n useState,\r\n} from \"react\";\r\n\r\nimport { nfcService } from \"../nfc/service\";\r\nimport type { NfcState } from \"../nfc/types\";\r\n\r\ninterface NfcContextValue {\r\n state: NfcState;\r\n service: typeof nfcService;\r\n}\r\n\r\nconst NfcContext = createContext<NfcContextValue | null>(null);\r\n\r\nexport function NfcProvider({ children }: PropsWithChildren) {\r\n const [state, setState] = useState(nfcService.getState());\r\n\r\n useEffect(() => {\r\n const unsubscribe = nfcService.subscribe(setState);\r\n return unsubscribe;\r\n }, []);\r\n\r\n return (\r\n <NfcContext.Provider value={{ state, service: nfcService }}>\r\n {children}\r\n </NfcContext.Provider>\r\n );\r\n}\r\n\r\nexport function useNfcContext() {\r\n const ctx = useContext(NfcContext);\r\n if (!ctx) throw new Error(\"useNfcContext must be inside <NfcProvider>\");\r\n return ctx;\r\n}\r\n","import { useEffect } from \"react\";\nimport type { TagEvent } from \"react-native-nfc-manager\";\n\nimport { nfcService } from \"../nfc/service\";\n\nexport function useNfc(\n onTag: (tagId: string) => void,\n options: { cooldownMs?: number },\n) {\n useEffect(() => {\n nfcService.startReader(\n async (tag: TagEvent) => {\n if (!tag.id) return;\n onTag(tag.id);\n },\n { cooldownMs: options?.cooldownMs },\n );\n\n return () => {\n nfcService.stopReader();\n };\n }, [onTag]);\n}\n","import { useCallback } from \"react\";\nimport type { TagEvent } from \"react-native-nfc-manager\";\n\nimport { nfcService } from \"../nfc/service\";\n\nexport function useNfcReader() {\n const start = useCallback(\n (onTag?: (tag: TagEvent) => Promise<void> | void, cooldownMs?: number) => {\n nfcService.startReader(onTag, { cooldownMs });\n },\n [],\n );\n\n const stop = useCallback(() => {\n nfcService.stopReader();\n }, []);\n\n return { start, stop };\n}\n","import { useEffect, useState } from \"react\";\r\n\r\nimport { nfcService } from \"../nfc\";\r\n\r\nexport function useNfcState() {\r\n const [nfcState, setNfcState] = useState(nfcService.getState());\r\n\r\n useEffect(() => nfcService.subscribe(setNfcState), []);\r\n\r\n return nfcState;\r\n}\r\n","import NfcManager, {\r\n Ndef,\r\n type NdefRecord,\r\n NfcTech,\r\n} from \"react-native-nfc-manager\";\r\n\r\nimport { nfcService } from \"../nfc/service\";\r\n\r\nexport function useNfcTechnology() {\r\n async function writeNdef(records: NdefRecord[]) {\r\n return nfcService.withTechnology(NfcTech.Ndef, async () => {\r\n const bytes = Ndef.encodeMessage(records);\r\n await NfcManager.ndefHandler.writeNdefMessage(bytes);\r\n });\r\n }\r\n\r\n async function runWithTech(\r\n tech: NfcTech | NfcTech[],\r\n fn: () => Promise<void>,\r\n ) {\r\n return nfcService.withTechnology(tech, fn);\r\n }\r\n\r\n return {\r\n writeNdef,\r\n runWithTech,\r\n };\r\n}\r\n"],"mappings":"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","names":["NfcManager","_a","NfcManager","operations","utils","NfcManager","NfcManager","Platform","NfcTech","utils","utils","NfcManager","operations","utils","NfcManager","operations","utils","NfcManager","NfcTech","operations","NfcTech","NfcManager","utils","operations","utils","useEffect","useEffect","useEffect","useState","useState","useEffect","NfcManager","Ndef","NfcTech","NfcTech","Ndef","NfcManager"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spencerls/react-native-nfc",
3
- "version": "1.0.6",
3
+ "version": "1.0.8",
4
4
  "description": "A lightweight NFC manager for React Native projects using react-native-nfc-manager.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",