Skip to content

Commit

Permalink
feat: add react hooks
Browse files Browse the repository at this point in the history
  • Loading branch information
Sec-ant committed Jan 3, 2024
1 parent e84eee2 commit 3be4d1d
Show file tree
Hide file tree
Showing 11 changed files with 236 additions and 4 deletions.
55 changes: 55 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

26 changes: 24 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,27 @@
},
"./reader/zxing_reader.wasm": "./dist/reader/zxing_reader.wasm",
"./writer/zxing_writer.wasm": "./dist/writer/zxing_writer.wasm",
"./full/zxing_full.wasm": "./dist/full/zxing_full.wasm"
"./full/zxing_full.wasm": "./dist/full/zxing_full.wasm",
"./react": {
"import": "./dist/es/react/full/index.js",
"require": "./dist/cjs/react/full/index.js",
"default": "./dist/es/react/full/index.js"
},
"./react/full": {
"import": "./dist/es/react/full/index.js",
"require": "./dist/cjs/react/full/index.js",
"default": "./dist/es/react/full/index.js"
},
"./react/reader": {
"import": "./dist/es/react/reader/index.js",
"require": "./dist/cjs/react/reader/index.js",
"default": "./dist/es/react/reader/index.js"
},
"./react/writer": {
"import": "./dist/es/react/writer/index.js",
"require": "./dist/cjs/react/writer/index.js",
"default": "./dist/es/react/writer/index.js"
}
},
"repository": {
"type": "git",
Expand All @@ -41,7 +61,7 @@
"homepage": "https://github.com/Sec-ant/zxing-wasm",
"bugs": {
"url": "https://github.com/Sec-ant/zxing-wasm/issues",
"email": "[email protected]"
"email": "[email protected]"
},
"keywords": [
"qrcode",
Expand Down Expand Up @@ -106,13 +126,15 @@
"@babel/types": "^7.23.6",
"@types/babel__core": "^7.20.5",
"@types/node": "^20.10.6",
"@types/react": "^18.2.46",
"@typescript-eslint/eslint-plugin": "^6.17.0",
"@typescript-eslint/parser": "^6.17.0",
"concurrently": "^8.2.2",
"copy-files-from-to": "^3.9.1",
"eslint": "^8.56.0",
"npm-check-updates": "^16.14.12",
"prettier": "^3.1.1",
"react": "^18.2.0",
"rimraf": "^5.0.5",
"tsx": "^4.7.0",
"typedoc": "^0.25.6",
Expand Down
9 changes: 8 additions & 1 deletion scripts/build-iife.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,14 @@ async function buildIife() {
formats: ["iife"],
name: "ZXingWASM",
},
rollupOptions: undefined,
rollupOptions: {
external: ["react"],
output: {
globals: {
react: "React",
},
},
},
outDir: "dist/iife",
emptyOutDir: false,
},
Expand Down
1 change: 1 addition & 0 deletions src/react/full/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from "./useZXingWasm.js";
56 changes: 56 additions & 0 deletions src/react/full/useZXingWasm.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
import { useCallback, useEffect } from "react";
import {
type ReaderOptions,
readBarcodesFromImageData as _readBarcodesFromImageData,
readBarcodesFromImageFile as _readBarcodesFromImageFile,
type WriterOptions,
writeBarcodeToImageFile as _writeBarcodeToImageFile,
setZXingModuleOverrides,
} from "../../full/index.js";

export const useZXingWasm = (
wasmLocation?: string,
readerOptions?: ReaderOptions,
writerOptions?: WriterOptions,
) => {
// re-init zxing module when wasm location changes
useEffect(() => {
if (typeof wasmLocation === "undefined") {
return;
}
setZXingModuleOverrides({
locateFile: (path, prefix) => {
if (path.endsWith(".wasm")) {
return wasmLocation;
}
return prefix + path;
},
});
}, [wasmLocation]);
// readBarcodesFromImageData
const readBarcodesFromImageData = useCallback(
(image: ImageData) => {
return _readBarcodesFromImageData(image, readerOptions);
},
[readerOptions],
);
// readBarcodesFromImageFile
const readBarcodesFromImageFile = useCallback(
(image: Blob) => {
return _readBarcodesFromImageFile(image, readerOptions);
},
[readerOptions],
);
// writeBarcodeToImageFile
const writeBarcodeToImageFile = useCallback(
(text: string) => {
return _writeBarcodeToImageFile(text, writerOptions);
},
[writerOptions],
);
return {
readBarcodesFromImageData,
readBarcodesFromImageFile,
writeBarcodeToImageFile,
};
};
1 change: 1 addition & 0 deletions src/react/reader/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from "./useZXingWasm.js";
45 changes: 45 additions & 0 deletions src/react/reader/useZXingWasm.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import { useCallback, useEffect } from "react";
import {
type ReaderOptions,
readBarcodesFromImageData as _readBarcodesFromImageData,
readBarcodesFromImageFile as _readBarcodesFromImageFile,
setZXingModuleOverrides,
} from "../../reader/index.js";

export const useZXingWasm = (
wasmLocation?: string,
readerOptions?: ReaderOptions,
) => {
// re-init zxing module when wasm location changes
useEffect(() => {
if (typeof wasmLocation === "undefined") {
return;
}
setZXingModuleOverrides({
locateFile: (path, prefix) => {
if (path.endsWith(".wasm")) {
return wasmLocation;
}
return prefix + path;
},
});
}, [wasmLocation]);
// readBarcodesFromImageData
const readBarcodesFromImageData = useCallback(
(image: ImageData) => {
return _readBarcodesFromImageData(image, readerOptions);
},
[readerOptions],
);
// readBarcodesFromImageFile
const readBarcodesFromImageFile = useCallback(
(image: Blob) => {
return _readBarcodesFromImageFile(image, readerOptions);
},
[readerOptions],
);
return {
readBarcodesFromImageData,
readBarcodesFromImageFile,
};
};
1 change: 1 addition & 0 deletions src/react/writer/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from "./useZXingWasm.js";
36 changes: 36 additions & 0 deletions src/react/writer/useZXingWasm.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import { useCallback, useEffect } from "react";
import {
type WriterOptions,
writeBarcodeToImageFile as _writeBarcodeToImageFile,
setZXingModuleOverrides,
} from "../../writer/index.js";

export const useZXingWasm = (
wasmLocation?: string,
writerOptions?: WriterOptions,
) => {
// re-init zxing module when wasm location changes
useEffect(() => {
if (typeof wasmLocation === "undefined") {
return;
}
setZXingModuleOverrides({
locateFile: (path, prefix) => {
if (path.endsWith(".wasm")) {
return wasmLocation;
}
return prefix + path;
},
});
}, [wasmLocation]);
// writeBarcodeToImageFile
const writeBarcodeToImageFile = useCallback(
(text: string) => {
return _writeBarcodeToImageFile(text, writerOptions);
},
[writerOptions],
);
return {
writeBarcodeToImageFile,
};
};
6 changes: 5 additions & 1 deletion typedoc.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,11 @@
"entryPoints": [
"./src/full/index.ts",
"./src/reader/index.ts",
"./src/writer/index.ts"
"./src/writer/index.ts",
"./src/react/full/index.ts",
"./src/react/reader/index.ts",
"./src/react/writer/index.ts"
],
"sortEntryPoints": false,
"out": "docs"
}
4 changes: 4 additions & 0 deletions vite.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -67,12 +67,16 @@ export default defineConfig({
"reader/index": "src/reader/index.ts",
"writer/index": "src/writer/index.ts",
"full/index": "src/full/index.ts",
"react/reader/index": "src/react/reader/index.ts",
"react/writer/index": "src/react/writer/index.ts",
"react/full/index": "src/react/full/index.ts",
},
formats: ["es"],
fileName: (_, entryName) => `${entryName}.js`,
},
outDir: "dist/es",
rollupOptions: {
external: ["react"],
output: {
manualChunks: (id) => {
if (
Expand Down

0 comments on commit 3be4d1d

Please sign in to comment.