- Update BUILDING.md with current build system information - Modernize various README files across the project - Update CHANGELOG.md with recent changes - Improve documentation consistency and formatting - Update platform-specific documentation (iOS, Electron, Docker) - Enhance test documentation and build guides
170 lines
3.8 KiB
Markdown
170 lines
3.8 KiB
Markdown
# TimeSafari Deep Linking Documentation
|
|
|
|
## Type System Overview
|
|
|
|
The deep linking system uses a multi-layered type safety approach:
|
|
|
|
1. **Runtime Validation (Zod Schemas)**
|
|
- Validates URL structure
|
|
- Enforces parameter requirements
|
|
- Sanitizes input data
|
|
- Provides detailed validation errors
|
|
- Generates TypeScript types automatically
|
|
|
|
2. **TypeScript Types**
|
|
- Generated from Zod schemas using `z.infer`
|
|
- Ensures compile-time type safety
|
|
- Provides IDE autocompletion
|
|
- Catches type errors during development
|
|
- Maintains single source of truth for types
|
|
|
|
3. **Router Integration**
|
|
- Type-safe parameter passing
|
|
- Route-specific parameter validation
|
|
- Query parameter type checking
|
|
- Automatic type inference for route parameters
|
|
|
|
## Type System Implementation
|
|
|
|
### Zod Schema to TypeScript Type Generation
|
|
|
|
```typescript
|
|
// Define the schema
|
|
const claimSchema = z.object({
|
|
id: z.string(),
|
|
view: z.enum(["details", "certificate", "raw"]).optional()
|
|
});
|
|
|
|
// TypeScript type is automatically generated
|
|
type ClaimParams = z.infer<typeof claimSchema>;
|
|
// Equivalent to:
|
|
// type ClaimParams = {
|
|
// id: string;
|
|
// view?: "details" | "certificate" | "raw";
|
|
// }
|
|
```
|
|
|
|
### Type Safety Layers
|
|
|
|
1. **Schema Definition**
|
|
|
|
```typescript
|
|
// src/interfaces/deepLinks.ts
|
|
export const deepLinkSchemas = {
|
|
claim: z.object({
|
|
id: z.string(),
|
|
view: z.enum(["details", "certificate", "raw"]).optional()
|
|
}),
|
|
// Other route schemas...
|
|
};
|
|
```
|
|
|
|
2. **Type Generation**
|
|
|
|
```typescript
|
|
// Types are automatically generated from schemas
|
|
export type DeepLinkParams = {
|
|
[K in keyof typeof deepLinkSchemas]: z.infer<(typeof deepLinkSchemas)[K]>;
|
|
};
|
|
```
|
|
|
|
3. **Runtime Validation**
|
|
|
|
```typescript
|
|
// In DeepLinkHandler
|
|
const result = deepLinkSchemas.claim.safeParse(params);
|
|
if (!result.success) {
|
|
// Handle validation errors
|
|
console.error(result.error);
|
|
}
|
|
```
|
|
|
|
### Error Handling Types
|
|
|
|
```typescript
|
|
export interface DeepLinkError extends Error {
|
|
code: string;
|
|
details?: unknown;
|
|
}
|
|
|
|
// Usage in error handling
|
|
try {
|
|
await handler.handleDeepLink(url);
|
|
} catch (error) {
|
|
if (error instanceof DeepLinkError) {
|
|
// Type-safe error handling
|
|
console.error(error.code, error.message);
|
|
}
|
|
}
|
|
```
|
|
|
|
## Implementation Files
|
|
|
|
- `src/interfaces/deepLinks.ts`: Type definitions and validation schemas
|
|
- `src/services/deepLinks.ts`: Deep link processing service
|
|
- `src/main.capacitor.ts`: Capacitor integration
|
|
- `src/views/DeepLinkRedirectView.vue`: Page to handle links to both mobile and web
|
|
|
|
## Type Safety Examples
|
|
|
|
```typescript
|
|
// Parameter type safety
|
|
type ClaimParams = DeepLinkParams["claim"];
|
|
// TypeScript knows this has:
|
|
// - id: string
|
|
// - view?: "details" | "certificate" | "raw"
|
|
// Runtime validation
|
|
const result = deepLinkSchemas.claim.safeParse({
|
|
id: "123",
|
|
view: "details"
|
|
});
|
|
// Validates at runtime with detailed error messages
|
|
```
|
|
|
|
## Supported URL Schemes
|
|
|
|
All deep links follow the format: `timesafari://<route>/<param>?<query>`
|
|
|
|
### Claim Routes
|
|
|
|
- `timesafari://claim/:id`
|
|
- Query params:
|
|
- `view`: "details" | "certificate" | "raw"
|
|
|
|
- `timesafari://claim-cert/:id`
|
|
- `timesafari://claim-add-raw/:id`
|
|
- Query params:
|
|
- `claim`: JSON string of claim data
|
|
- `claimJwtId`: JWT ID for claim
|
|
|
|
### Contact Routes
|
|
|
|
- `timesafari://contact-edit/:did`
|
|
- `timesafari://contact-import/:jwt`
|
|
- Query params:
|
|
- `contacts`: JSON array of contacts
|
|
|
|
### Project Routes
|
|
|
|
- `timesafari://project/:id`
|
|
- Query params:
|
|
- `view`: "details" | "edit"
|
|
|
|
### Invite Routes
|
|
|
|
- `timesafari://invite-one-accept/:jwt`
|
|
- Query params:
|
|
- `type`: "one" | "many"
|
|
|
|
### Gift Routes
|
|
|
|
- `timesafari://confirm-gift/:id`
|
|
- Query params:
|
|
- `action`: "confirm" | "details"
|
|
|
|
### Offer Routes
|
|
|
|
- `timesafari://offer-details/:id`
|
|
- Query params:
|
|
- `view`: "details"
|