From ad4a4e1f479495ddbe3e85c97d393f5b447268e9 Mon Sep 17 00:00:00 2001 From: zadit biasa aja <75159257+insvrgent@users.noreply.github.com> Date: Sun, 29 Jun 2025 17:49:33 +0000 Subject: [PATCH] ok --- package-lock.json | 387 ++++++++++++++++++++++++++++++++++++++++++++++ package.json | 1 + public/ktp.jpeg | Bin 0 -> 69682 bytes src/KTPScanner.js | 196 +++++++++++++++++++---- 4 files changed, 551 insertions(+), 33 deletions(-) create mode 100644 public/ktp.jpeg diff --git a/package-lock.json b/package-lock.json index 2f7fa4e..e6ea98a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,6 +12,7 @@ "@testing-library/jest-dom": "^6.6.3", "@testing-library/react": "^16.3.0", "@testing-library/user-event": "^13.5.0", + "pixelmatch": "^7.1.0", "react": "^19.1.0", "react-dom": "^19.1.0", "react-router-dom": "^7.6.2", @@ -2771,6 +2772,27 @@ "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==" }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "optional": true, + "peer": true, + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { "version": "5.1.1-v1", "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", @@ -4018,6 +4040,13 @@ "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", "deprecated": "Use your platform's native atob() and btoa() methods instead" }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "optional": true, + "peer": true + }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -4250,6 +4279,28 @@ "node": ">= 8" } }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "optional": true, + "peer": true + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "deprecated": "This package is no longer supported.", + "optional": true, + "peer": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", @@ -5102,6 +5153,22 @@ } ] }, + "node_modules/canvas": { + "version": "2.11.2", + "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.11.2.tgz", + "integrity": "sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==", + "hasInstallScript": true, + "optional": true, + "peer": true, + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.0", + "nan": "^2.17.0", + "simple-get": "^3.0.3" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/case-sensitive-paths-webpack-plugin": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz", @@ -5172,6 +5239,16 @@ "node": ">= 6" } }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "optional": true, + "peer": true, + "engines": { + "node": ">=10" + } + }, "node_modules/chrome-trace-event": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", @@ -5335,6 +5412,16 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "optional": true, + "peer": true, + "bin": { + "color-support": "bin.js" + } + }, "node_modules/colord": { "version": "2.9.3", "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", @@ -5436,6 +5523,13 @@ "node": ">=0.8" } }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "optional": true, + "peer": true + }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -5983,6 +6077,19 @@ "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.5.0.tgz", "integrity": "sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==" }, + "node_modules/decompress-response": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", + "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", + "optional": true, + "peer": true, + "dependencies": { + "mimic-response": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/dedent": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", @@ -6060,6 +6167,13 @@ "node": ">=0.4.0" } }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "optional": true, + "peer": true + }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -6085,6 +6199,16 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/detect-libc": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", + "optional": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, "node_modules/detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -7792,6 +7916,39 @@ "node": ">=12" } }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "optional": true, + "peer": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "optional": true, + "peer": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs-minipass/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "optional": true, + "peer": true + }, "node_modules/fs-monkey": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz", @@ -7850,6 +8007,28 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "deprecated": "This package is no longer supported.", + "optional": true, + "peer": true, + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -8168,6 +8347,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "optional": true, + "peer": true + }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", @@ -10563,6 +10749,19 @@ "node": ">=6" } }, + "node_modules/mimic-response": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", + "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", + "optional": true, + "peer": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/min-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", @@ -10622,6 +10821,40 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "optional": true, + "peer": true, + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "optional": true, + "peer": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "optional": true, + "peer": true + }, "node_modules/mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", @@ -10660,6 +10893,13 @@ "thenify-all": "^1.0.0" } }, + "node_modules/nan": { + "version": "2.22.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.22.2.tgz", + "integrity": "sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ==", + "optional": true, + "peer": true + }, "node_modules/nanoid": { "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", @@ -10765,6 +11005,22 @@ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==" }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "optional": true, + "peer": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -10803,6 +11059,20 @@ "node": ">=8" } }, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "deprecated": "This package is no longer supported.", + "optional": true, + "peer": true, + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, "node_modules/nth-check": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", @@ -11264,6 +11534,17 @@ "node": ">= 6" } }, + "node_modules/pixelmatch": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-7.1.0.tgz", + "integrity": "sha512-1wrVzJ2STrpmONHKBy228LM1b84msXDUoAzVEl0R8Mz4Ce6EPr+IVtxm8+yvrqLYMHswREkjYFaMxnyGnaY3Ng==", + "dependencies": { + "pngjs": "^7.0.0" + }, + "bin": { + "pixelmatch": "bin/pixelmatch" + } + }, "node_modules/pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", @@ -11328,6 +11609,14 @@ "node": ">=4" } }, + "node_modules/pngjs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-7.0.0.tgz", + "integrity": "sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==", + "engines": { + "node": ">=14.19.0" + } + }, "node_modules/possible-typed-array-names": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", @@ -13826,6 +14115,13 @@ "node": ">= 0.8.0" } }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "optional": true, + "peer": true + }, "node_modules/set-cookie-parser": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", @@ -13982,6 +14278,39 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "optional": true, + "peer": true + }, + "node_modules/simple-get": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz", + "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==", + "optional": true, + "peer": true, + "dependencies": { + "decompress-response": "^4.2.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", @@ -14833,6 +15162,54 @@ "node": ">=6" } }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "optional": true, + "peer": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "optional": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "optional": true, + "peer": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "optional": true, + "peer": true + }, "node_modules/temp-dir": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", @@ -15911,6 +16288,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "optional": true, + "peer": true, + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", diff --git a/package.json b/package.json index 4ab9a48..24a79c0 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,7 @@ "@testing-library/jest-dom": "^6.6.3", "@testing-library/react": "^16.3.0", "@testing-library/user-event": "^13.5.0", + "pixelmatch": "^7.1.0", "react": "^19.1.0", "react-dom": "^19.1.0", "react-router-dom": "^7.6.2", diff --git a/public/ktp.jpeg b/public/ktp.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..a22b67f89780a1acd84a98456387d6c514fa355e GIT binary patch literal 69682 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 NN=I}j3i036{{wAf?`!}7 literal 0 HcmV?d00001 diff --git a/src/KTPScanner.js b/src/KTPScanner.js index fc69aaf..311e084 100644 --- a/src/KTPScanner.js +++ b/src/KTPScanner.js @@ -1,6 +1,7 @@ import React, { useEffect, useRef, useState } from "react"; import Modal from "./Modal"; import FormComponent from "./FormComponent"; +import pixelmatch from "pixelmatch"; const STORAGE_KEY = "camera_canvas_gallery"; @@ -17,11 +18,47 @@ const CameraCanvas = () => { const [modalOpen, setModalOpen] = useState(false); const [loading, setLoading] = useState(false); + const [KTPdetected, setKTPdetected] = useState(false); + const fileInputRef = useRef(null); const triggerFileSelect = () => { fileInputRef.current?.click(); }; + const loadImageToCanvas = (src, width, height) => { + return new Promise((resolve) => { + const img = new Image(); + img.src = src; + img.onload = () => { + const canvas = document.createElement("canvas"); + canvas.width = width; + canvas.height = height; + const ctx = canvas.getContext("2d"); + ctx.drawImage(img, 0, 0, width, height); + resolve(canvas); + }; + }); + }; + + const isImageSimilar = (canvasA, canvasB) => { + const ctxA = canvasA.getContext("2d"); + const ctxB = canvasB.getContext("2d"); + + const imgA = ctxA.getImageData(0, 0, canvasA.width, canvasA.height); + const imgB = ctxB.getImageData(0, 0, canvasB.width, canvasB.height); + + const diffPixels = pixelmatch( + imgA.data, + imgB.data, + null, + canvasA.width, + canvasA.height, + { threshold: 0.6 } + ); + + const similarity = diffPixels / (canvasA.width * canvasA.height); + return similarity < 0.2; // you can adjust the threshold + }; const rectRef = useRef({ x: 0, @@ -149,7 +186,7 @@ const CameraCanvas = () => { getCameraStream(); }, [isFreeze]); - const shootImage = () => { + const shootImage = async () => { const video = videoRef.current; const { x, y, width, height } = rectRef.current; const hiddenCanvas = hiddenCanvasRef.current; @@ -163,6 +200,7 @@ const CameraCanvas = () => { canvasRef.current.height ); setIsFreeze(true); + setLoading(true); hiddenCtx.drawImage(video, 0, 0, hiddenCanvas.width, hiddenCanvas.height); @@ -185,12 +223,24 @@ const CameraCanvas = () => { const imageDataUrl = cropCanvas.toDataURL("image/png", 1.0); setCapturedImage(imageDataUrl); + + // 👉 Load sample KTP and compare + const sampleKtpCanvas = await loadImageToCanvas( + "/ktp.jpeg", + cropCanvas.width, + cropCanvas.height + ); + + const isSimilar = isImageSimilar(cropCanvas, sampleKtpCanvas); + setKTPdetected(isSimilar); + + setLoading(false); + // Continue to OCR etc... }; const ReadImage = async (capturedImage) => { try { setLoading(true); - setModalOpen(true); let res = await fetch( "https://bot.kediritechnopark.com/webhook/mastersnapper/read", @@ -268,24 +318,13 @@ const CameraCanvas = () => { setCapturedImage(imageDataUrl); setIsFreeze(true); - // Create an image object from the uploaded file const image = new Image(); - image.onload = () => { - // Get the width of the rounded rectangle from rectRef + image.onload = async () => { const rectWidth = rectRef.current.width; const rectHeight = rectRef.current.height; - - // Create a canvas to draw the uploaded image const canvas = canvasRef.current; const ctx = canvas.getContext("2d"); - // Set the scale factor based on the rectangle width - const scaleFactor = rectWidth / image.width; - - // Calculate the new height based on the aspect ratio - const newHeight = image.height * scaleFactor; - - // Clear the canvas and draw the video or freeze frame ctx.clearRect(0, 0, canvas.width, canvas.height); if (isFreeze && freezeFrameRef.current) { ctx.putImageData(freezeFrameRef.current, 0, 0); @@ -294,7 +333,6 @@ const CameraCanvas = () => { ctx.drawImage(video, 0, 0, canvas.width, canvas.height); } - // Draw the rounded rectangle drawRoundedRect( ctx, rectRef.current.x, @@ -304,7 +342,6 @@ const CameraCanvas = () => { rectRef.current.radius ); - // Draw the image inside the rounded rectangle ctx.save(); ctx.beginPath(); ctx.moveTo( @@ -352,26 +389,79 @@ const CameraCanvas = () => { rectRef.current.y ); ctx.closePath(); - ctx.clip(); // Clip the image within the rounded rectangle + ctx.clip(); + + // === Object-Fit: Cover Logic === + const imageAspectRatio = image.width / image.height; + const rectAspectRatio = rectWidth / rectHeight; + + let sx, sy, sWidth, sHeight; + + if (imageAspectRatio > rectAspectRatio) { + // Image is wider than rect + sHeight = image.height; + sWidth = sHeight * rectAspectRatio; + sx = (image.width - sWidth) / 2; + sy = 0; + } else { + // Image is taller than rect + sWidth = image.width; + sHeight = sWidth / rectAspectRatio; + sx = 0; + sy = (image.height - sHeight) / 2; + } - // Draw the uploaded image inside the clipped region ctx.drawImage( image, + sx, + sy, + sWidth, + sHeight, rectRef.current.x, rectRef.current.y, rectWidth, - newHeight // Height is scaled based on the image's aspect ratio + rectHeight ); + // ============================== ctx.restore(); - // Save the image data into the freeze frame reference freezeFrameRef.current = ctx.getImageData( 0, 0, canvas.width, canvas.height ); + + const cropCanvas = document.createElement("canvas"); + cropCanvas.width = rectWidth; + cropCanvas.height = rectHeight; + const cropCtx = cropCanvas.getContext("2d"); + + cropCtx.drawImage( + canvas, + rectRef.current.x, + rectRef.current.y, + rectWidth, + rectHeight, + 0, + 0, + rectWidth, + rectHeight + ); + + const ktpSample = new Image(); + ktpSample.src = "/ktp.jpeg"; + ktpSample.onload = () => { + const sampleCanvas = document.createElement("canvas"); + sampleCanvas.width = rectWidth; + sampleCanvas.height = rectHeight; + const sampleCtx = sampleCanvas.getContext("2d"); + sampleCtx.drawImage(ktpSample, 0, 0, rectWidth, rectHeight); + + const isSimilar = isImageSimilar(cropCanvas, sampleCanvas); + setKTPdetected(isSimilar); + }; }; image.src = imageDataUrl; }; @@ -424,7 +514,6 @@ const CameraCanvas = () => { padding: "20px", }} > -

Data Verification

{!isFreeze ? ( <>
{ > Ambil Gambar
-
atau
+
atau
{ style={{ marginRight: 10, display: "none" }} /> + ) : loading ? ( +
+
+ +
) : ( -
ReadImage(capturedImage)} - > - Scan KTP +
+

+ KTP {!KTPdetected && "Tidak"} Terdeteksi +

+
ReadImage(capturedImage)} + > + {!KTPdetected && "Tetap"} Simpan +
+ +

{ + setFileTemp(null); + setIsFreeze(false); + }} + > + Hapus +

)}
@@ -488,4 +596,26 @@ const CameraCanvas = () => { ); }; +const spinnerStyle = ` +@keyframes spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} +`; + +const styles = { + spinnerContainer: { + textAlign: "center", + padding: 40, + }, + spinner: { + border: "4px solid #f3f3f3", + borderTop: "4px solid #3498db", + borderRadius: "50%", + width: 40, + height: 40, + animation: "spin 1s linear infinite", + margin: "0 auto", + }, +}; export default CameraCanvas;