From 160ae6d25e9a665179c3cf5950e957d3f65c1020 Mon Sep 17 00:00:00 2001 From: Timo Glastra Date: Mon, 25 Nov 2024 21:42:23 +0100 Subject: [PATCH] android native intent fixes Signed-off-by: Timo Glastra --- apps/easypid/src/app/+native-intent.tsx | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/apps/easypid/src/app/+native-intent.tsx b/apps/easypid/src/app/+native-intent.tsx index 89584597..a526b4fd 100644 --- a/apps/easypid/src/app/+native-intent.tsx +++ b/apps/easypid/src/app/+native-intent.tsx @@ -1,8 +1,10 @@ import { parseInvitationUrl } from '@package/agent' import { deeplinkSchemes } from '@package/app' import * as Haptics from 'expo-haptics' +import { Platform } from 'react-native' +import { router } from 'expo-router' -export async function redirectSystemPath({ path }: { path: string; initial: boolean }) { +export async function redirectSystemPath({ path, initial }: { path: string; initial: boolean }) { const isRecognizedDeeplink = deeplinkSchemes.some((scheme) => path.startsWith(scheme)) if (!isRecognizedDeeplink) return path @@ -15,14 +17,27 @@ export async function redirectSystemPath({ path }: { path: string; initial: bool const invitationData = parseResult.result + let redirectPath: string | undefined = undefined + if (invitationData.type === 'openid-credential-offer') { - return `/notifications/openIdCredential?${invitationData.format === 'url' ? 'uri' : 'data'}=${encodeURIComponent(invitationData.format === 'parsed' ? JSON.stringify(invitationData.data) : (invitationData.data as string))}` + redirectPath = `/(app)/notifications/openIdCredential?${invitationData.format === 'url' ? 'uri' : 'data'}=${encodeURIComponent(invitationData.format === 'parsed' ? JSON.stringify(invitationData.data) : (invitationData.data as string))}` } if (invitationData.type === 'openid-authorization-request') { - return `//notifications/openIdPresentation?${invitationData.format === 'url' ? 'uri' : 'data'}=${encodeURIComponent(invitationData.format === 'parsed' ? JSON.stringify(invitationData.data) : (invitationData.data as string))}` + redirectPath = `/(app)/notifications/openIdPresentation?${invitationData.format === 'url' ? 'uri' : 'data'}=${encodeURIComponent(invitationData.format === 'parsed' ? JSON.stringify(invitationData.data) : (invitationData.data as string))}` } if (invitationData.type === 'didcomm') { - return `/(app)/notifications/didcomm?${invitationData.format === 'url' ? 'invitationUrl' : 'invitation'}=${encodeURIComponent(invitationData.format === 'parsed' ? JSON.stringify(invitationData.data) : (invitationData.data as string))}` + redirectPath = `/notifications/didcomm?${invitationData.format === 'url' ? 'invitationUrl' : 'invitation'}=${encodeURIComponent(invitationData.format === 'parsed' ? JSON.stringify(invitationData.data) : (invitationData.data as string))}` + } + + if (redirectPath) { + // NOTE: on android it somehow doesn't handle the intent if the app is already open + // so we replace the router to the path. I think it can break easily though if e.g. + // the wallet is locked in the background. Not sure how to proceed, this is best effort fix + if (Platform.OS === 'android' && !initial) { + router.replace(redirectPath) + return null + } + return redirectPath } void Haptics.notificationAsync(Haptics.NotificationFeedbackType.Error)