From ee81c52172e053c5c345cca668a6e9409d479ea5 Mon Sep 17 00:00:00 2001 From: TZGyn Date: Wed, 14 Aug 2024 23:33:39 +0800 Subject: [PATCH] add public routes for viewing qr code + switched using qr-code-styling for qr code generation --- frontend/bun.lockb | Bin 220267 -> 212702 bytes frontend/fly.toml | 2 +- frontend/package.json | 3 +- frontend/src/hooks.server.ts | 4 +- .../lib/components/ui/sonner/sonner.svelte | 2 + .../links/[id]/qr/(components)/qr.svelte | 60 +++++++------ .../links/[linkid]/qr/(components)/qr.svelte | 60 +++++++------ .../[id]/settings/(components)/DemoQR.svelte | 29 +++++-- .../(app)/dashboard/settings/+layout.svelte | 6 +- .../settings/qr/(components)/DemoQR.svelte | 29 +++++-- .../(landing)/[...catchall]/+page.server.ts | 6 -- .../{ => (public)}/(landing)/+layout.svelte | 0 .../{ => (public)}/(landing)/+page.svelte | 0 .../routes/(public)/qr/invalid/+page.svelte | 14 ++++ .../url/[id]/qr/+page.server.ts} | 39 ++++----- .../routes/(public)/url/[id]/qr/+page.svelte | 79 ++++++++++++++++++ .../[...catchall]/+page.svelte | 2 +- 17 files changed, 227 insertions(+), 108 deletions(-) delete mode 100644 frontend/src/routes/(landing)/[...catchall]/+page.server.ts rename frontend/src/routes/{ => (public)}/(landing)/+layout.svelte (100%) rename frontend/src/routes/{ => (public)}/(landing)/+page.svelte (100%) create mode 100644 frontend/src/routes/(public)/qr/invalid/+page.svelte rename frontend/src/routes/{api/shortener/[id]/qr/+server.ts => (public)/url/[id]/qr/+page.server.ts} (50%) create mode 100644 frontend/src/routes/(public)/url/[id]/qr/+page.svelte rename frontend/src/routes/{(landing) => }/[...catchall]/+page.svelte (85%) diff --git a/frontend/bun.lockb b/frontend/bun.lockb index dbe073b221c38320e3bae05b4b6c33afdc990ba6..d4a3e7691b77ef4ea026cf222cc9c3ce2839b4ea 100755 GIT binary patch delta 33568 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 pu3g>~@nUv`Vq { const pathname = event.url.pathname - const protected_api = ['/api/logout'] - if ( pathname.startsWith('/dashboard') || - protected_api.includes(pathname) + pathname.startsWith('/api') ) { if (!sessionId) { redirect(303, '/login') diff --git a/frontend/src/lib/components/ui/sonner/sonner.svelte b/frontend/src/lib/components/ui/sonner/sonner.svelte index 14c1d94..485bb13 100644 --- a/frontend/src/lib/components/ui/sonner/sonner.svelte +++ b/frontend/src/lib/components/ui/sonner/sonner.svelte @@ -10,6 +10,8 @@ - import QRCode from 'qrcode' import { Button } from '$lib/components/ui/button' import { toast } from 'svelte-sonner' import * as DropdownMenu from '$lib/components/ui/dropdown-menu' import { Badge } from '$lib/components/ui/badge' + import QRCodeStyling from 'qr-code-styling' export let background = '#fff' export let color = '#000' @@ -34,23 +34,28 @@ } async function generateQrCode() { - try { - image = await QRCode.toDataURL(value, { - errorCorrectionLevel: 'L', - margin: 1, - scale: 20, - color: { - light: background, - dark: color, - }, - }) - } catch (e) { - image = await QRCode.toDataURL(value, { + const qrcodestyling = new QRCodeStyling({ + data: value, + width: 300, + height: 300, + margin: 10, + qrOptions: { errorCorrectionLevel: 'L', - margin: 1, - scale: 20, - }) - } + typeNumber: 0, + }, + backgroundOptions: { + color: background, + }, + dotsOptions: { + color: color, + }, + cornersSquareOptions: { + type: 'square', + }, + }) + const blob = await qrcodestyling.getRawData() + if (!blob) return + image = URL.createObjectURL(blob) } $: { @@ -60,25 +65,28 @@ } -
+
{value} {value} -
- +
+ + + Standard + Standard - With Color + href={`/url/${code}/qr?color=true`} + target="_blank"> + With Color +
diff --git a/frontend/src/routes/(app)/dashboard/projects/[id]/links/[linkid]/qr/(components)/qr.svelte b/frontend/src/routes/(app)/dashboard/projects/[id]/links/[linkid]/qr/(components)/qr.svelte index 93f4885..4936525 100644 --- a/frontend/src/routes/(app)/dashboard/projects/[id]/links/[linkid]/qr/(components)/qr.svelte +++ b/frontend/src/routes/(app)/dashboard/projects/[id]/links/[linkid]/qr/(components)/qr.svelte @@ -1,9 +1,9 @@ -
+
{value} {value} -
- +
+ + + Standard + Standard - With Color + href={`/url/${code}/qr?color=true`} + target="_blank"> + With Color +
diff --git a/frontend/src/routes/(app)/dashboard/projects/[id]/settings/(components)/DemoQR.svelte b/frontend/src/routes/(app)/dashboard/projects/[id]/settings/(components)/DemoQR.svelte index 4c64199..3b80f19 100644 --- a/frontend/src/routes/(app)/dashboard/projects/[id]/settings/(components)/DemoQR.svelte +++ b/frontend/src/routes/(app)/dashboard/projects/[id]/settings/(components)/DemoQR.svelte @@ -1,6 +1,6 @@ + +
+
+
+
404
+
Invalid Url
+
+ +
+
diff --git a/frontend/src/routes/api/shortener/[id]/qr/+server.ts b/frontend/src/routes/(public)/url/[id]/qr/+page.server.ts similarity index 50% rename from frontend/src/routes/api/shortener/[id]/qr/+server.ts rename to frontend/src/routes/(public)/url/[id]/qr/+page.server.ts index 06d62b1..7f51d19 100644 --- a/frontend/src/routes/api/shortener/[id]/qr/+server.ts +++ b/frontend/src/routes/(public)/url/[id]/qr/+page.server.ts @@ -1,17 +1,16 @@ import { db } from '$lib/db' -import type { RequestHandler } from './$types' -import QRCode from 'qrcode' import { redirect } from '@sveltejs/kit' import { env } from '$env/dynamic/public' +import type { PageServerLoad } from './$types' const shortenerUrl = env.PUBLIC_SHORTENER_URL -export const GET: RequestHandler = async (event) => { - const shortenerId = event.params.id +export const load = (async (event) => { + const { id } = event.params const color = event.url.searchParams.get('color') const shortener = await db.query.shortener.findFirst({ - where: (shortener, { eq }) => eq(shortener.code, shortenerId), + where: (shortener, { eq }) => eq(shortener.code, id), with: { user: { with: { @@ -23,23 +22,25 @@ export const GET: RequestHandler = async (event) => { }) if (!shortener) { - redirect(303, '/') + redirect(301, `/dashboard/links`) } - let colorSetting = {} + let colorSetting: { + color: { background: string | null; foreground: string | null } + } | null = null if (color === 'true') { if (shortener.project) { colorSetting = { color: { - light: shortener.project.qr_background, - dark: shortener.project.qr_foreground, + background: shortener.project.qr_background, + foreground: shortener.project.qr_foreground, }, } } else if (shortener.user.setting) { colorSetting = { color: { - light: shortener.user.setting.qr_background, - dark: shortener.user.setting.qr_foreground, + background: shortener.user.setting.qr_background, + foreground: shortener.user.setting.qr_foreground, }, } } @@ -50,17 +51,5 @@ export const GET: RequestHandler = async (event) => { ? shortener.project.custom_domain || shortenerUrl : shortenerUrl - const image = await QRCode.toBuffer(url + '/' + shortenerId, { - type: 'png', - errorCorrectionLevel: 'L', - margin: 1, - scale: 20, - ...colorSetting, - }) - - return new Response(image, { - headers: { - 'Content-Type': 'image/png', - }, - }) -} + return { shortener, url, colorSetting, shortenerId: id } +}) satisfies PageServerLoad diff --git a/frontend/src/routes/(public)/url/[id]/qr/+page.svelte b/frontend/src/routes/(public)/url/[id]/qr/+page.svelte new file mode 100644 index 0000000..30111a8 --- /dev/null +++ b/frontend/src/routes/(public)/url/[id]/qr/+page.svelte @@ -0,0 +1,79 @@ + + + + + + {data.url + '/' + data.shortenerId} + + {data.url + + + diff --git a/frontend/src/routes/(landing)/[...catchall]/+page.svelte b/frontend/src/routes/[...catchall]/+page.svelte similarity index 85% rename from frontend/src/routes/(landing)/[...catchall]/+page.svelte rename to frontend/src/routes/[...catchall]/+page.svelte index 55acd07..4156e69 100644 --- a/frontend/src/routes/(landing)/[...catchall]/+page.svelte +++ b/frontend/src/routes/[...catchall]/+page.svelte @@ -3,7 +3,7 @@ import Button from '$lib/components/ui/button/button.svelte' -
+
404