aboutsummaryrefslogtreecommitdiffstats
path: root/src/routes/(app)/qr
diff options
context:
space:
mode:
authorAdam Soltys <[email protected]>2025-07-13 23:05:57 -0700
committerAdam Soltys <[email protected]>2025-07-13 23:05:57 -0700
commitc2d798b8825cc3c5011069f4bcdf2c7dd5234292 (patch)
tree4f35b9e0740e74846eac04f0e494f88ac4e1c2c3 /src/routes/(app)/qr
parentc95e08ff4e582c38489e46414d0e36bbc21e7ea1 (diff)
downloadcoinos-ui-c2d798b8825cc3c5011069f4bcdf2c7dd5234292.tar.gz
coinos-ui-c2d798b8825cc3c5011069f4bcdf2c7dd5234292.zip
tap qr
Diffstat (limited to 'src/routes/(app)/qr')
-rw-r--r--src/routes/(app)/qr/[text]/[icon]/+server.ts33
-rw-r--r--src/routes/(app)/qr/[text]/raw/+server.ts1
2 files changed, 34 insertions, 0 deletions
diff --git a/src/routes/(app)/qr/[text]/[icon]/+server.ts b/src/routes/(app)/qr/[text]/[icon]/+server.ts
new file mode 100644
index 00000000..c2825877
--- /dev/null
+++ b/src/routes/(app)/qr/[text]/[icon]/+server.ts
@@ -0,0 +1,33 @@
+import { createCanvas, loadImage } from "canvas";
+import QRCode from "qrcode";
+
+export async function GET({ params }) {
+ const { icon, text } = params;
+ const size = 600;
+
+ const canvas = createCanvas(size, size);
+ await QRCode.toCanvas(canvas, text, {
+ errorCorrectionLevel: "H",
+ width: size,
+ });
+
+ const ctx = canvas.getContext("2d");
+
+ const logo = await loadImage(`static/images/${icon}`);
+ const logoSize = size * 0.3;
+ ctx.drawImage(
+ logo,
+ (size - logoSize) / 2,
+ (size - logoSize) / 2,
+ logoSize,
+ logoSize,
+ );
+
+ const buffer = canvas.toBuffer("image/png");
+ return new Response(buffer, {
+ headers: {
+ "Content-Type": "image/png",
+ "Cache-Control": "public, max-age=31536000, immutable",
+ },
+ });
+}
diff --git a/src/routes/(app)/qr/[text]/raw/+server.ts b/src/routes/(app)/qr/[text]/raw/+server.ts
index a24d3a3c..a2626c4d 100644
--- a/src/routes/(app)/qr/[text]/raw/+server.ts
+++ b/src/routes/(app)/qr/[text]/raw/+server.ts
@@ -14,3 +14,4 @@ export async function GET({ params }) {
},
});
}
+