Browse Source

feat: add claim route deep linking support

- Add claim route to deep link schema
- Add claim view test to deeplink tests
- Update build docs for clean web builds
- Add rm -rf dist to build steps

Technical Changes:
- Add claim schema with id parameter
- Add claim route test using generated claim ID
- Add clean step before web/capacitor builds
- Update Android build instructions

This adds support for deep linking to claim views and
improves the build process reliability by ensuring clean
builds. The claim route allows direct navigation to claim
details via external links.
pull/127/head
Matthew Raymer 2 days ago
parent
commit
b590e41ec8
  1. 124
      BUILDING.md
  2. 9
      src/services/deepLinks.ts
  3. 21
      src/types/deepLinks.ts
  4. 3
      test-scripts/run-deeplink-tests.sh

124
BUILDING.md

@ -135,6 +135,7 @@ Prerequisites: Android Studio with SDK installed
1. Build the web assets: 1. Build the web assets:
```bash ```bash
rm -rf dist
npm run build:web npm run build:web
npm run build:capacitor npm run build:capacitor
``` ```
@ -163,76 +164,77 @@ Prerequisites: Android Studio with SDK installed
You must add the following intent filter to the `android/app/src/main/AndroidManifest.xml` file: You must add the following intent filter to the `android/app/src/main/AndroidManifest.xml` file:
```xml ```xml
<intent-filter android:autoVerify="true"> <intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" /> <action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" /> <category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="timesafari" /> <data android:scheme="timesafari" />
</intent-filter> </intent-filter>
``` ```
You must also add the following to the `android/app/build.gradle` file: You must also add the following to the `android/app/build.gradle` file:
```gradle ```gradle
android { android {
// ... existing config ... // ... existing config ...
lintOptions { lintOptions {
disable 'UnsanitizedFilenameFromContentProvider' disable 'UnsanitizedFilenameFromContentProvider'
abortOnError false abortOnError false
baseline file("lint-baseline.xml") baseline file("lint-baseline.xml")
// Ignore Capacitor module issues // Ignore Capacitor module issues
ignore 'DefaultLocale' ignore 'DefaultLocale'
ignore 'UnsanitizedFilenameFromContentProvider' ignore 'UnsanitizedFilenameFromContentProvider'
ignore 'LintBaseline' ignore 'LintBaseline'
ignore 'LintBaselineFixed' ignore 'LintBaselineFixed'
} }
} }
``` ```
Modify `/android/build.gradle` to use a stable version of AGP and make sure Kotlin version is compatible. Modify `/android/build.gradle` to use a stable version of AGP and make sure Kotlin version is compatible.
```gradle ```gradle
buildscript { buildscript {
repositories { repositories {
google() google()
mavenCentral() mavenCentral()
} }
dependencies { dependencies {
// Use a stable version of AGP // Use a stable version of AGP
classpath 'com.android.tools.build:gradle:8.1.0' classpath 'com.android.tools.build:gradle:8.1.0'
// Make sure Kotlin version is compatible // Make sure Kotlin version is compatible
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.8.0" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.8.0"
} }
} }
allprojects { allprojects {
repositories { repositories {
google() google()
mavenCentral() mavenCentral()
} }
} }
// Add this to handle version conflicts // Add this to handle version conflicts
configurations.all { configurations.all {
resolutionStrategy { resolutionStrategy {
force 'org.jetbrains.kotlin:kotlin-stdlib:1.8.0' force 'org.jetbrains.kotlin:kotlin-stdlib:1.8.0'
force 'org.jetbrains.kotlin:kotlin-stdlib-common:1.8.0' force 'org.jetbrains.kotlin:kotlin-stdlib-common:1.8.0'
} }
} }
``` ```
## Building Android from the console ## Building Android from the console
```bash ```bash
./gradlew clean cd android
./gradlew build -Dlint.baselines.continue=true ./gradlew clean
./gradlew build -Dlint.baselines.continue=true
npx cap cd ..
``` npx cap run android
```
## Development ## Development

9
src/services/deepLinks.ts

@ -110,11 +110,18 @@ export class DeepLinkHandler {
query: Record<string, string>, query: Record<string, string>,
): Promise<void> { ): Promise<void> {
const routeMap: Record<string, string> = { const routeMap: Record<string, string> = {
"user-profile": "user-profile",
"project": "project",
"onboard-meeting-setup": "onboard-meeting-setup",
"invite-one-accept": "invite-one-accept",
"contact-import": "contact-import",
"confirm-gift": "confirm-gift",
"claim": "claim",
"claim-cert": "claim-cert", "claim-cert": "claim-cert",
"claim-add-raw": "claim-add-raw", "claim-add-raw": "claim-add-raw",
"contact-edit": "contact-edit", "contact-edit": "contact-edit",
"contacts": "contacts", "contacts": "contacts",
did: "did" "did": "did"
}; };
const routeName = routeMap[path]; const routeName = routeMap[path];

21
src/types/deepLinks.ts

@ -36,6 +36,27 @@ export const baseUrlSchema = z.object({
// Parameter validation schemas for each route type // Parameter validation schemas for each route type
export const deepLinkSchemas = { export const deepLinkSchemas = {
"user-profile": z.object({
id: z.string()
}),
"project-details": z.object({
id: z.string()
}),
"onboard-meeting-setup": z.object({
id: z.string()
}),
"invite-one-accept": z.object({
id: z.string()
}),
"contact-import": z.object({
jwt: z.string()
}),
"confirm-gift": z.object({
id: z.string()
}),
"claim": z.object({
id: z.string()
}),
"claim-cert": z.object({ "claim-cert": z.object({
id: z.string() id: z.string()
}), }),

3
test-scripts/run-deeplink-tests.sh

@ -104,6 +104,9 @@ main() {
CONTACTS=$(cat .generated/contacts.json) CONTACTS=$(cat .generated/contacts.json)
# 1. Claim-based deeplinks # 1. Claim-based deeplinks
execute_deeplink "timesafari://claim/$(jq -r .claim_id <<< "$CLAIM_DETAILS")" \
"Testing claim view"
execute_deeplink "timesafari://claim-cert/$(jq -r .claim_id <<< "$CLAIM_DETAILS")" \ execute_deeplink "timesafari://claim-cert/$(jq -r .claim_id <<< "$CLAIM_DETAILS")" \
"Testing claim certificate view" "Testing claim certificate view"

Loading…
Cancel
Save