From 36dc223276e0a55fcf5c278075da6a5e8d8d9051 Mon Sep 17 00:00:00 2001
From: Martin Domajnko <35891136+martines3000@users.noreply.github.com>
Date: Wed, 28 Jun 2023 13:20:14 +0200
Subject: [PATCH 1/3] feat: QR code scanning support (#290)
* feat: qr generation, scanning, prisma, api routes
* feat: working demo
* chore: update OPTIONS request
* feat: update toasts
* feat: add postinstall script for prisma
* feat: reduces serverless function sizes
* chore: should fix scrolling issues
* fix: fixes crashing on no camera permissions
---
.gitignore | 1 +
.prettierignore | 1 +
packages/dapp/.env.example | 3 +
packages/dapp/next.config.js | 9 +
packages/dapp/package.json | 6 +
packages/dapp/prisma/schema.prisma | 15 ++
.../authorization-request/page.tsx | 0
.../create-verifiable-presentation/page.tsx | 0
.../{ => (protected)}/get-credential/page.tsx | 0
.../app/[locale]/app/(protected)/layout.tsx | 14 ++
.../[locale]/app/{ => (protected)}/page.tsx | 0
.../app/{ => (protected)}/settings/page.tsx | 0
.../verifiable-credential/[slug]/page.tsx | 0
.../verifiable-credential/not-found.tsx | 0
.../app/(public)/qr-code-session/page.tsx | 22 ++
packages/dapp/src/app/[locale]/app/layout.tsx | 10 +-
.../app/api/qr-code-session/[id]/route.tsx | 118 ++++++++++
.../src/components/AppBottomBar/index.tsx | 14 +-
.../dapp/src/components/AppNavbar/index.tsx | 8 +-
.../components/AuthorizationRequest/index.tsx | 79 +++----
.../CheckMetaMaskCompatibility/index.tsx | 214 ++++++++++++++++++
.../components/ConnectedProvider/index.tsx | 49 +---
.../src/components/Controlbar/Controlbar.tsx | 46 ++--
.../CreateConnectionModal.tsx | 122 ++++++++++
.../components/CreateConnectionCard/index.tsx | 46 ++++
.../components/CredentialOfferModal/index.tsx | 73 ++++++
.../dapp/src/components/DeleteModal/index.tsx | 65 +++---
.../src/components/GetCredential/index.tsx | 95 ++++----
.../src/components/MetaMaskProvider/index.tsx | 167 +-------------
.../components/MethodDropdownMenu/index.tsx | 55 +++--
.../src/components/ModifyDSModal/index.tsx | 50 ++--
.../src/components/QRCodeScanner/index.tsx | 84 +++++++
.../QRCodeSessionProvider/index.tsx | 121 ++++++++++
.../ScanConnectionCard/ScanQRCodeModal.tsx | 83 +++++++
.../components/ScanConnectionCard/index.tsx | 180 +++++++++++++++
.../src/components/SettingsCard/index.tsx | 33 +--
.../src/components/ToastWrapper/index.tsx | 5 +-
.../dapp/src/components/VCTable/index.tsx | 48 ++--
packages/dapp/src/messages/en.json | 4 +-
packages/dapp/src/stores/index.ts | 1 +
packages/dapp/src/stores/sessionStore.ts | 25 ++
packages/dapp/src/stores/toastStore.ts | 20 +-
packages/dapp/src/styles/globals.css | 4 +-
packages/dapp/src/utils/prisma.ts | 9 +
pnpm-lock.yaml | 66 ++++++
45 files changed, 1492 insertions(+), 473 deletions(-)
create mode 100644 packages/dapp/prisma/schema.prisma
rename packages/dapp/src/app/[locale]/app/{ => (protected)}/authorization-request/page.tsx (100%)
rename packages/dapp/src/app/[locale]/app/{ => (protected)}/create-verifiable-presentation/page.tsx (100%)
rename packages/dapp/src/app/[locale]/app/{ => (protected)}/get-credential/page.tsx (100%)
create mode 100644 packages/dapp/src/app/[locale]/app/(protected)/layout.tsx
rename packages/dapp/src/app/[locale]/app/{ => (protected)}/page.tsx (100%)
rename packages/dapp/src/app/[locale]/app/{ => (protected)}/settings/page.tsx (100%)
rename packages/dapp/src/app/[locale]/app/{ => (protected)}/verifiable-credential/[slug]/page.tsx (100%)
rename packages/dapp/src/app/[locale]/app/{ => (protected)}/verifiable-credential/not-found.tsx (100%)
create mode 100644 packages/dapp/src/app/[locale]/app/(public)/qr-code-session/page.tsx
create mode 100644 packages/dapp/src/app/api/qr-code-session/[id]/route.tsx
create mode 100644 packages/dapp/src/components/CheckMetaMaskCompatibility/index.tsx
create mode 100644 packages/dapp/src/components/CreateConnectionCard/CreateConnectionModal.tsx
create mode 100644 packages/dapp/src/components/CreateConnectionCard/index.tsx
create mode 100644 packages/dapp/src/components/CredentialOfferModal/index.tsx
create mode 100644 packages/dapp/src/components/QRCodeScanner/index.tsx
create mode 100644 packages/dapp/src/components/QRCodeSessionProvider/index.tsx
create mode 100644 packages/dapp/src/components/ScanConnectionCard/ScanQRCodeModal.tsx
create mode 100644 packages/dapp/src/components/ScanConnectionCard/index.tsx
create mode 100644 packages/dapp/src/stores/sessionStore.ts
create mode 100644 packages/dapp/src/utils/prisma.ts
diff --git a/.gitignore b/.gitignore
index 779f9d219..b774302d0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -79,3 +79,4 @@ nx-cloud.env
.yarn/install-state.gz
.pnp.*
.vscode
+.vercel
diff --git a/.prettierignore b/.prettierignore
index 71c46681f..489ea7105 100644
--- a/.prettierignore
+++ b/.prettierignore
@@ -3,3 +3,4 @@ apps
libs
packages
pnpm-lock.yaml
+.vercel
diff --git a/packages/dapp/.env.example b/packages/dapp/.env.example
index 1a1f22bcd..8e8fc7e1a 100644
--- a/packages/dapp/.env.example
+++ b/packages/dapp/.env.example
@@ -1,2 +1,5 @@
NEXT_PUBLIC_DEMO_ISSUER=http://localhost:3003
NEXT_PUBLIC_DEMO_VERIFIER=http://localhost:3004
+
+# Prisma
+DATABASE_URL=
diff --git a/packages/dapp/next.config.js b/packages/dapp/next.config.js
index a83dc1aaf..272f27d0f 100644
--- a/packages/dapp/next.config.js
+++ b/packages/dapp/next.config.js
@@ -1,4 +1,5 @@
const StylelintPlugin = require('stylelint-webpack-plugin');
+const path = require('path');
// Content-Security-Policy
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy
@@ -31,6 +32,14 @@ const nextConfig = {
optimizeFonts: true,
experimental: {
appDir: true,
+ outputFileTracingRoot: path.join(__dirname, '../../'),
+ outputFileTracingExcludes: {
+ '*': [
+ 'node_modules/@swc/core-linux-x64-gnu',
+ 'node_modules/@swc/core-linux-x64-musl',
+ 'node_modules/@esbuild/linux-x64',
+ ],
+ },
},
env: {
USE_LOCAL: process.env.USE_LOCAL || 'false',
diff --git a/packages/dapp/package.json b/packages/dapp/package.json
index 380866e47..4206d7d3b 100644
--- a/packages/dapp/package.json
+++ b/packages/dapp/package.json
@@ -9,6 +9,7 @@
"build:docker": "pnpm build",
"dev": "cross-env USE_LOCAL='true' next dev",
"docker:build": "docker build . -t blockchain-lab-um/dapp:latest",
+ "postinstall": "pnpm prisma generate --schema=./prisma/schema.prisma",
"lint": "pnpm lint:next && pnpm lint:tsc && pnpm lint:prettier && pnpm lint:stylelint",
"lint:fix": "next lint . --fix && prettier . --write",
"lint:next": "next lint",
@@ -26,6 +27,7 @@
"@heroicons/react": "^2.0.18",
"@metamask/detect-provider": "^2.0.0",
"@metamask/providers": "^10.2.0",
+ "@prisma/client": "^4.16.1",
"@radix-ui/react-toast": "^1.1.4",
"@tanstack/react-table": "^8.9.2",
"@veramo/core": "5.2.0",
@@ -34,6 +36,7 @@
"clsx": "^1.2.1",
"did-jwt-vc": "^3.2.4",
"ethers": "^6.5.1",
+ "html5-qrcode": "^2.3.8",
"lint-staged": "^13.2.2",
"luxon": "^3.3.0",
"next": "13.4.6",
@@ -42,9 +45,11 @@
"next-themes": "^0.2.1",
"prettier-plugin-tailwindcss": "^0.3.0",
"prop-types": "^15.8.1",
+ "qrcode.react": "^3.1.0",
"qs": "^6.11.2",
"react": "18.2.0",
"react-dom": "18.2.0",
+ "swr": "^2.2.0",
"tailwind-scrollbar": "^3.0.4",
"zustand": "^4.3.8"
},
@@ -67,6 +72,7 @@
"postcss": "^8.4.24",
"prettier": "^2.8.4",
"prettier-plugin-packagejson": "^2.4.3",
+ "prisma": "^4.16.1",
"rimraf": "^5.0.1",
"sass": "^1.63.4",
"stylelint": "^15.8.0",
diff --git a/packages/dapp/prisma/schema.prisma b/packages/dapp/prisma/schema.prisma
new file mode 100644
index 000000000..e2ad86a3e
--- /dev/null
+++ b/packages/dapp/prisma/schema.prisma
@@ -0,0 +1,15 @@
+generator client {
+ provider = "prisma-client-js"
+}
+
+datasource db {
+ provider = "mysql"
+ url = env("DATABASE_URL")
+ relationMode = "prisma"
+}
+
+model sessions {
+ id String @id @default(uuid())
+ data String? @db.VarChar(512)
+ iv String? @db.VarChar(128)
+}
diff --git a/packages/dapp/src/app/[locale]/app/authorization-request/page.tsx b/packages/dapp/src/app/[locale]/app/(protected)/authorization-request/page.tsx
similarity index 100%
rename from packages/dapp/src/app/[locale]/app/authorization-request/page.tsx
rename to packages/dapp/src/app/[locale]/app/(protected)/authorization-request/page.tsx
diff --git a/packages/dapp/src/app/[locale]/app/create-verifiable-presentation/page.tsx b/packages/dapp/src/app/[locale]/app/(protected)/create-verifiable-presentation/page.tsx
similarity index 100%
rename from packages/dapp/src/app/[locale]/app/create-verifiable-presentation/page.tsx
rename to packages/dapp/src/app/[locale]/app/(protected)/create-verifiable-presentation/page.tsx
diff --git a/packages/dapp/src/app/[locale]/app/get-credential/page.tsx b/packages/dapp/src/app/[locale]/app/(protected)/get-credential/page.tsx
similarity index 100%
rename from packages/dapp/src/app/[locale]/app/get-credential/page.tsx
rename to packages/dapp/src/app/[locale]/app/(protected)/get-credential/page.tsx
diff --git a/packages/dapp/src/app/[locale]/app/(protected)/layout.tsx b/packages/dapp/src/app/[locale]/app/(protected)/layout.tsx
new file mode 100644
index 000000000..0bfffc95b
--- /dev/null
+++ b/packages/dapp/src/app/[locale]/app/(protected)/layout.tsx
@@ -0,0 +1,14 @@
+import ConnectedProvider from '@/components/ConnectedProvider';
+import MetaMaskProvider from '@/components/MetaMaskProvider';
+
+export default async function ProtectedLayout({
+ children,
+}: {
+ children: React.ReactNode;
+}) {
+ return (
+
+ You can use this page to create a connection with your mobile device + and use it as a QR code scanner. +
++ The Create Connection button will show a QR code that contains your + session ID and a secret encryption key. This allows for end to end + encryption of your data between your mobile device and your browser. +
++ To create a connection on your browser you need to be connected to + MetaMask and Masca, but your mobile device does not need to be. +
++ Use this on your mobile device to first scan the connection QR code + to astablish a connection with your browser. After that you can scan + any other QR code that you want to pass to your browser to be + handled by the Masca Dapp. +
+