@spencerls/react-native-nfc 1.0.6 → 1.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -112,7 +112,6 @@ declare class NfcService {
112
112
  private isProcessingTag;
113
113
  private currentOnTag?;
114
114
  private currentCooldownMs;
115
- private lastUsedReaderFlags;
116
115
  constructor();
117
116
  private setState;
118
117
  getState(): NfcState;
@@ -122,7 +121,6 @@ declare class NfcService {
122
121
  }): Promise<void>;
123
122
  stopReader(): Promise<void>;
124
123
  private _resetReaderState;
125
- private _restartIosReader;
126
124
  withTechnology<T>(tech: NfcTech | NfcTech[], handler: () => Promise<T>): Promise<T>;
127
125
  }
128
126
  declare const nfcService: NfcService;
@@ -191,7 +189,7 @@ declare function useNfc(onTag: (tagId: string) => void, options: {
191
189
  }): void;
192
190
 
193
191
  declare function useNfcReader(): {
194
- start: (flags: number, onTag: (tag: TagEvent) => void, cooldownMs?: number) => void;
192
+ start: (flags: number, onTag?: (tag: TagEvent) => Promise<void> | void, cooldownMs?: number) => void;
195
193
  stop: () => void;
196
194
  };
197
195
 
package/dist/index.d.ts CHANGED
@@ -112,7 +112,6 @@ declare class NfcService {
112
112
  private isProcessingTag;
113
113
  private currentOnTag?;
114
114
  private currentCooldownMs;
115
- private lastUsedReaderFlags;
116
115
  constructor();
117
116
  private setState;
118
117
  getState(): NfcState;
@@ -122,7 +121,6 @@ declare class NfcService {
122
121
  }): Promise<void>;
123
122
  stopReader(): Promise<void>;
124
123
  private _resetReaderState;
125
- private _restartIosReader;
126
124
  withTechnology<T>(tech: NfcTech | NfcTech[], handler: () => Promise<T>): Promise<T>;
127
125
  }
128
126
  declare const nfcService: NfcService;
@@ -191,7 +189,7 @@ declare function useNfc(onTag: (tagId: string) => void, options: {
191
189
  }): void;
192
190
 
193
191
  declare function useNfcReader(): {
194
- start: (flags: number, onTag: (tag: TagEvent) => void, cooldownMs?: number) => void;
192
+ start: (flags: number, onTag?: (tag: TagEvent) => Promise<void> | void, cooldownMs?: number) => void;
195
193
  stop: () => void;
196
194
  };
197
195
 
package/dist/index.js CHANGED
@@ -58,13 +58,11 @@ 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;
68
66
  import_react_native_nfc_manager.default.start();
69
67
  }
70
68
  // -----------------------------
@@ -85,7 +83,7 @@ var NfcService = class {
85
83
  };
86
84
  }
87
85
  // -----------------------------
88
- // START READER
86
+ // START READER (Soft Continuous Mode)
89
87
  // -----------------------------
90
88
  async startReader(readerModeFlags, onTag, options) {
91
89
  var _a;
@@ -95,30 +93,25 @@ var NfcService = class {
95
93
  }
96
94
  this.currentOnTag = onTag;
97
95
  this.currentCooldownMs = (_a = options == null ? void 0 : options.cooldownMs) != null ? _a : 1500;
98
- this.lastUsedReaderFlags = readerModeFlags;
99
96
  this.isProcessingTag = false;
100
97
  this.setState({ mode: "starting", tag: null });
101
98
  import_react_native_nfc_manager.default.setEventListener(
102
99
  import_react_native_nfc_manager.NfcEvents.DiscoverTag,
103
100
  async (tag) => {
101
+ var _a2;
104
102
  if (!tag) return;
105
103
  if (this.isProcessingTag) return;
106
104
  this.isProcessingTag = true;
107
105
  this.setState({ tag, mode: "active" });
108
106
  try {
109
- if (this.currentOnTag) {
110
- await this.currentOnTag(tag);
111
- }
107
+ await ((_a2 = this.currentOnTag) == null ? void 0 : _a2.call(this, tag));
112
108
  } catch (err) {
113
109
  console.warn("[NFC] onTag handler error:", err);
114
110
  } finally {
115
111
  const cooldown = this.currentCooldownMs;
116
- setTimeout(async () => {
112
+ setTimeout(() => {
117
113
  this.isProcessingTag = false;
118
114
  this.setState({ tag: null, mode: "active" });
119
- if (import_react_native.Platform.OS === "ios") {
120
- await this._restartIosReader();
121
- }
122
115
  }, cooldown);
123
116
  }
124
117
  }
@@ -137,7 +130,7 @@ var NfcService = class {
137
130
  }
138
131
  }
139
132
  // -----------------------------
140
- // STOP READER
133
+ // STOP READER (explicit only)
141
134
  // -----------------------------
142
135
  async stopReader() {
143
136
  if (["idle", "stopping"].includes(this.state.mode)) return;
@@ -155,24 +148,6 @@ var NfcService = class {
155
148
  this.isProcessingTag = false;
156
149
  }
157
150
  // -----------------------------
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
151
  // Technology sessions (NDEF, NfcV, etc.)
177
152
  // -----------------------------
178
153
  async withTechnology(tech, handler) {
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\";\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\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); // emit immediately\n return () => {\n this.listeners.delete(fn);\n };\n }\n\n // -----------------------------\n // START READER (Soft Continuous Mode)\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.isProcessingTag = false;\n\n this.setState({ mode: \"starting\", tag: null });\n\n // Tag listener\n NfcManager.setEventListener(\n NfcEvents.DiscoverTag,\n async (tag: TagEvent) => {\n if (!tag) return;\n\n // Prevent reprocessing until tag removed & cooldown completed\n if (this.isProcessingTag) return;\n\n this.isProcessingTag = true;\n this.setState({ tag, mode: \"active\" });\n\n try {\n await this.currentOnTag?.(tag);\n } catch (err) {\n console.warn(\"[NFC] onTag handler error:\", err);\n } finally {\n const cooldown = this.currentCooldownMs;\n\n // After cooldown, allow a new scan *only after tag is removed*\n setTimeout(() => {\n this.isProcessingTag = false;\n this.setState({ tag: null, mode: \"active\" });\n }, cooldown);\n }\n },\n );\n\n // Start reader\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 (explicit only)\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 }\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 // Stop reader before using tech session\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 singleton\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 (\r\n flags: number, \r\n onTag?: (tag: TagEvent) => Promise<void> | void, \r\n 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","_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,13 +20,11 @@ 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;
30
28
  NfcManager.start();
31
29
  }
32
30
  // -----------------------------
@@ -47,7 +45,7 @@ var NfcService = class {
47
45
  };
48
46
  }
49
47
  // -----------------------------
50
- // START READER
48
+ // START READER (Soft Continuous Mode)
51
49
  // -----------------------------
52
50
  async startReader(readerModeFlags, onTag, options) {
53
51
  var _a;
@@ -57,30 +55,25 @@ var NfcService = class {
57
55
  }
58
56
  this.currentOnTag = onTag;
59
57
  this.currentCooldownMs = (_a = options == null ? void 0 : options.cooldownMs) != null ? _a : 1500;
60
- this.lastUsedReaderFlags = readerModeFlags;
61
58
  this.isProcessingTag = false;
62
59
  this.setState({ mode: "starting", tag: null });
63
60
  NfcManager.setEventListener(
64
61
  NfcEvents.DiscoverTag,
65
62
  async (tag) => {
63
+ var _a2;
66
64
  if (!tag) return;
67
65
  if (this.isProcessingTag) return;
68
66
  this.isProcessingTag = true;
69
67
  this.setState({ tag, mode: "active" });
70
68
  try {
71
- if (this.currentOnTag) {
72
- await this.currentOnTag(tag);
73
- }
69
+ await ((_a2 = this.currentOnTag) == null ? void 0 : _a2.call(this, tag));
74
70
  } catch (err) {
75
71
  console.warn("[NFC] onTag handler error:", err);
76
72
  } finally {
77
73
  const cooldown = this.currentCooldownMs;
78
- setTimeout(async () => {
74
+ setTimeout(() => {
79
75
  this.isProcessingTag = false;
80
76
  this.setState({ tag: null, mode: "active" });
81
- if (Platform.OS === "ios") {
82
- await this._restartIosReader();
83
- }
84
77
  }, cooldown);
85
78
  }
86
79
  }
@@ -99,7 +92,7 @@ var NfcService = class {
99
92
  }
100
93
  }
101
94
  // -----------------------------
102
- // STOP READER
95
+ // STOP READER (explicit only)
103
96
  // -----------------------------
104
97
  async stopReader() {
105
98
  if (["idle", "stopping"].includes(this.state.mode)) return;
@@ -117,24 +110,6 @@ var NfcService = class {
117
110
  this.isProcessingTag = false;
118
111
  }
119
112
  // -----------------------------
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
113
  // Technology sessions (NDEF, NfcV, etc.)
139
114
  // -----------------------------
140
115
  async withTechnology(tech, handler) {
@@ -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\";\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\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); // emit immediately\n return () => {\n this.listeners.delete(fn);\n };\n }\n\n // -----------------------------\n // START READER (Soft Continuous Mode)\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.isProcessingTag = false;\n\n this.setState({ mode: \"starting\", tag: null });\n\n // Tag listener\n NfcManager.setEventListener(\n NfcEvents.DiscoverTag,\n async (tag: TagEvent) => {\n if (!tag) return;\n\n // Prevent reprocessing until tag removed & cooldown completed\n if (this.isProcessingTag) return;\n\n this.isProcessingTag = true;\n this.setState({ tag, mode: \"active\" });\n\n try {\n await this.currentOnTag?.(tag);\n } catch (err) {\n console.warn(\"[NFC] onTag handler error:\", err);\n } finally {\n const cooldown = this.currentCooldownMs;\n\n // After cooldown, allow a new scan *only after tag is removed*\n setTimeout(() => {\n this.isProcessingTag = false;\n this.setState({ tag: null, mode: \"active\" });\n }, cooldown);\n }\n },\n );\n\n // Start reader\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 (explicit only)\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 }\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 // Stop reader before using tech session\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 singleton\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 (\r\n flags: number, \r\n onTag?: (tag: TagEvent) => Promise<void> | void, \r\n 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","_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.7",
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",