From f41555d143ac500012f4b37f31e86735d3402525 Mon Sep 17 00:00:00 2001 From: phoebus-84 Date: Wed, 31 Jul 2024 12:32:52 +0200 Subject: [PATCH 01/23] feat: handle credential offer deep link in android --- android/app/src/main/AndroidManifest.xml | 6 ++++++ android/app/src/main/res/values/strings.xml | 2 +- src/lib/components/organisms/scanner/tools.ts | 2 +- src/lib/mobile_zencode | 2 +- src/routes/+layout.svelte | 17 +++++++++++++++-- 5 files changed, 24 insertions(+), 5 deletions(-) diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index a12da685..eac97004 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -6,6 +6,12 @@ + + + + + + diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml index 3b567bb6..6a9470af 100644 --- a/android/app/src/main/res/values/strings.xml +++ b/android/app/src/main/res/values/strings.xml @@ -3,5 +3,5 @@ Didroom Didroom didroom.forkbomb.eu - didroom.forkbomb.eu + openid-credential-offer diff --git a/src/lib/components/organisms/scanner/tools.ts b/src/lib/components/organisms/scanner/tools.ts index 505ef6ff..8ccf1b01 100644 --- a/src/lib/components/organisms/scanner/tools.ts +++ b/src/lib/components/organisms/scanner/tools.ts @@ -63,7 +63,7 @@ const credentialSchema = z.object({ id: z.string() }); -const serviceSchema = z.object({ +export const serviceSchema = z.object({ credential_configuration_ids: z.array(z.string()), credential_issuer: z.string().url() }); diff --git a/src/lib/mobile_zencode b/src/lib/mobile_zencode index 2a4dae00..f82274ac 160000 --- a/src/lib/mobile_zencode +++ b/src/lib/mobile_zencode @@ -1 +1 @@ -Subproject commit 2a4dae00558dbc179f27e3954270499d9b3441f0 +Subproject commit f82274ac8e74e4538f2f352bbe0c8286b6c07163 diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index b5e812d3..c1539100 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -8,7 +8,7 @@ import '../theme/custom.css'; import '../theme/variables.css'; - import { i18n, r } from '$lib/i18n'; + import { goto, i18n, r } from '$lib/i18n'; import { ParaglideJS } from '@inlang/paraglide-js-adapter-sveltekit'; import HiddenLogsButton from '$lib/components/molecules/HiddenLogsButton.svelte'; import { log } from '$lib/log'; @@ -17,6 +17,9 @@ import { navigating } from '$app/stores'; import Loading from '$lib/components/molecules/Loading.svelte'; import { App } from '@capacitor/app'; + import { credentialOfferStore } from '$lib/credentialOfferStore'; + import { serviceSchema, type Service } from '$lib/components/organisms/scanner/tools'; + const controller = new AbortController(); const signal = controller.signal; @@ -36,6 +39,16 @@ }, { signal } ); + + App.addListener('appUrlOpen', (data) => { + const url = data.url.split('openid-credential-offer://')[1]; + const credentialOfferContent = decodeURI(url.split('credential-offer=')[1]); + const parsedCredentialOffer = JSON.parse(credentialOfferContent) as Service; + if (serviceSchema.safeParse(parsedCredentialOffer).success) { + credentialOfferStore.set(parsedCredentialOffer); + goto('credential-offer'); + } + }); }); onDestroy(() => { controller.abort(); @@ -48,7 +61,7 @@ content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=5.0" /> -