diff --git a/src/lib/assets/bebop-b.svg b/assets/bebop-b.svg similarity index 71% rename from src/lib/assets/bebop-b.svg rename to assets/bebop-b.svg index e676bdaca..e46e13d53 100644 --- a/src/lib/assets/bebop-b.svg +++ b/assets/bebop-b.svg @@ -1,38 +1,7 @@ - - + height="561.73657"> QR code diff --git a/src/routes/(app)/order/[id]/payment/[paymentId]/qrcode/+server.ts b/src/routes/(app)/order/[id]/payment/[paymentId]/qrcode/+server.ts index 951ac9a20..72561098d 100644 --- a/src/routes/(app)/order/[id]/payment/[paymentId]/qrcode/+server.ts +++ b/src/routes/(app)/order/[id]/payment/[paymentId]/qrcode/+server.ts @@ -1,9 +1,17 @@ import { collections } from '$lib/server/database'; +import { rootDir } from '$lib/server/root-dir'; import { bitcoinPaymentQrCodeString } from '$lib/types/Order'; import { error } from '@sveltejs/kit'; import qrcode from 'qrcode'; +import { readFileSync } from 'node:fs'; +import { join } from 'node:path'; +import { building } from '$app/environment'; -export async function GET({ params }) { +const bebopLogoSvg = building ? '' : readFileSync(join(rootDir, 'assets/bebop-b.svg'), 'utf-8'); + +const BEBOP_LOGO_RATIO = 0.2; + +export async function GET({ params, url }) { const order = await collections.orders.findOne({ _id: params.id }); if (!order) { @@ -28,7 +36,35 @@ export async function GET({ params }) { ? bitcoinPaymentQrCodeString(payment.address, payment.price.amount, payment.price.currency) : payment.address; - return new Response(await qrcode.toString(address, { type: 'svg' }), { + let qrcodeString = (await qrcode.toString(address, { type: 'svg' })).trim(); + + const showLogo = url.searchParams.get('logo') === 'true'; + + if (showLogo) { + const viewBox = qrcodeString.match(/viewBox="([^"]+)"/)?.[1]; + const logoViewBox = bebopLogoSvg.match(/viewBox="([^"]+)"/)?.[1]; + const logoWidgth = Number(bebopLogoSvg.match(/width="([^"]+)"/)?.[1]); + const logoHeight = Number(bebopLogoSvg.match(/height="([^"]+)"/)?.[1]); + + if (viewBox && logoViewBox && !isNaN(logoWidgth) && !isNaN(logoHeight)) { + const [x, y, width, height] = viewBox.split(' ').map(Number); + // add logo to SVG + + const logoScale = Math.max(width / logoWidgth, height / logoHeight) * BEBOP_LOGO_RATIO; + const logoX = x + (width - Number(logoWidgth) * logoScale) / 2; + const logoY = y + (height - Number(logoHeight) * logoScale) / 2; + + const logoSvg = `${bebopLogoSvg}`; + const whiteRectBg = ``; + if (qrcodeString.endsWith('')) { + qrcodeString = qrcodeString.slice(0, -''.length) + whiteRectBg + logoSvg + ''; + } + } + } + + return new Response(qrcodeString, { headers: { 'content-type': 'image/svg+xml' }, status: 200 }); diff --git a/src/routes/(app)/pos/session/+page.svelte b/src/routes/(app)/pos/session/+page.svelte index 922f73de7..bb415c869 100644 --- a/src/routes/(app)/pos/session/+page.svelte +++ b/src/routes/(app)/pos/session/+page.svelte @@ -9,7 +9,6 @@ import { computePriceInfo } from '$lib/types/Cart.js'; import { orderRemainingToPay } from '$lib/types/Order.js'; import Trans from '$lib/components/Trans.svelte'; - import BEBOP_B_LOGO from '$lib/assets/bebop-b.svg'; interface CustomEventSource { onerror?: ((this: CustomEventSource, ev: Event) => unknown) | null; @@ -154,17 +153,10 @@

{t('order.singleTitle', { number: order?.number })}

QR code - {#if !data.removeBebopLogoPOS} - - {/if}
{/if} {:else if view === 'canceled'}