|
|
@ -44,6 +44,8 @@ |
|
|
|
*/ |
|
|
|
|
|
|
|
import { Router } from "vue-router"; |
|
|
|
import { z } from "zod"; |
|
|
|
|
|
|
|
import { |
|
|
|
deepLinkSchemas, |
|
|
|
baseUrlSchema, |
|
|
@ -53,6 +55,31 @@ import { |
|
|
|
import { logConsoleAndDb } from "../db/databaseUtil"; |
|
|
|
import type { DeepLinkError } from "../interfaces/deepLinks"; |
|
|
|
|
|
|
|
// Helper function to extract the first key from a Zod object schema
|
|
|
|
function getFirstKeyFromZodObject(schema: z.ZodObject<any>): string | undefined { |
|
|
|
const shape = schema.shape; |
|
|
|
const keys = Object.keys(shape); |
|
|
|
return keys.length > 0 ? keys[0] : undefined; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* Maps deep link routes to their corresponding Vue router names and optional parameter keys. |
|
|
|
* |
|
|
|
* It's an object where keys are the deep link routes and values are objects with 'name' and 'paramKey'. |
|
|
|
* |
|
|
|
* The paramKey is used to extract the parameter from the route path, |
|
|
|
* because "router.replace" expects the right parameter name for the route. |
|
|
|
*/ |
|
|
|
export const ROUTE_MAP: Record<string, { name: string; paramKey?: string }> = |
|
|
|
Object.entries(deepLinkSchemas).reduce((acc, [routeName, schema]) => { |
|
|
|
const paramKey = getFirstKeyFromZodObject(schema as z.ZodObject<any>); |
|
|
|
acc[routeName] = { |
|
|
|
name: routeName, |
|
|
|
paramKey |
|
|
|
}; |
|
|
|
return acc; |
|
|
|
}, {} as Record<string, { name: string; paramKey?: string }>); |
|
|
|
|
|
|
|
/** |
|
|
|
* Handles processing and routing of deep links in the application. |
|
|
|
* Provides validation, error handling, and routing for deep link URLs. |
|
|
@ -69,30 +96,7 @@ export class DeepLinkHandler { |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* Maps deep link routes to their corresponding Vue router names and optional parameter keys. |
|
|
|
* |
|
|
|
* The paramKey is used to extract the parameter from the route path, |
|
|
|
* because "router.replace" expects the right parameter name for the route. |
|
|
|
* The default is "id". |
|
|
|
*/ |
|
|
|
private readonly ROUTE_MAP: Record< |
|
|
|
string, |
|
|
|
{ name: string; paramKey?: string } |
|
|
|
> = { |
|
|
|
// note that similar lists are in src/interfaces/deepLinks.ts
|
|
|
|
claim: { name: "claim" }, |
|
|
|
"claim-add-raw": { name: "claim-add-raw" }, |
|
|
|
"claim-cert": { name: "claim-cert" }, |
|
|
|
"confirm-gift": { name: "confirm-gift" }, |
|
|
|
"contact-import": { name: "contact-import", paramKey: "jwt" }, |
|
|
|
did: { name: "did", paramKey: "did" }, |
|
|
|
"invite-one-accept": { name: "invite-one-accept", paramKey: "jwt" }, |
|
|
|
"onboard-meeting-members": { name: "onboard-meeting-members" }, |
|
|
|
project: { name: "project" }, |
|
|
|
"user-profile": { name: "user-profile" }, |
|
|
|
}; |
|
|
|
|
|
|
|
/** |
|
|
|
* Parses deep link URL into path, params and query components. |
|
|
|
* Validates URL structure using Zod schemas. |
|
|
|
* |
|
|
@ -126,7 +130,7 @@ export class DeepLinkHandler { |
|
|
|
// );
|
|
|
|
|
|
|
|
// Validate route exists before proceeding
|
|
|
|
if (!this.ROUTE_MAP[routePath]) { |
|
|
|
if (!ROUTE_MAP[routePath]) { |
|
|
|
throw { |
|
|
|
code: "INVALID_ROUTE", |
|
|
|
message: `Invalid route path: ${routePath}`, |
|
|
@ -144,7 +148,7 @@ export class DeepLinkHandler { |
|
|
|
const params: Record<string, string> = {}; |
|
|
|
if (pathParams) { |
|
|
|
// Now we know routePath exists in ROUTE_MAP
|
|
|
|
const routeConfig = this.ROUTE_MAP[routePath]; |
|
|
|
const routeConfig = ROUTE_MAP[routePath]; |
|
|
|
params[routeConfig.paramKey ?? "id"] = pathParams.join("/"); |
|
|
|
} |
|
|
|
return { path: routePath, params, query }; |
|
|
@ -170,7 +174,7 @@ export class DeepLinkHandler { |
|
|
|
try { |
|
|
|
// Validate route exists
|
|
|
|
const validRoute = routeSchema.parse(path) as DeepLinkRoute; |
|
|
|
routeName = this.ROUTE_MAP[validRoute].name; |
|
|
|
routeName = ROUTE_MAP[validRoute].name; |
|
|
|
} catch (error) { |
|
|
|
// Log the invalid route attempt
|
|
|
|
logConsoleAndDb(`[DeepLink] Invalid route path: ${path}`, true); |
|
|
|