managarten/packages/shared-links/src/deep-links.ts
Till JS 851a281e5a refactor: rename zitare -> quotes (Zitate)
Zitare was opaque Latin/Italian-flavored branding. Renamed to clear
English "quotes" (DE: Zitate) matching short-concrete-noun cluster.

- Module, routes, API, i18n, standalone landing app, plans dirs
- Dexie tables: quotesFavorites, quotesLists, quotesListTags,
  customQuotes (dropped redundant "quotes" prefix on the last)
- Logo QuotesLogo, theme quotes.css, search provider, dashboard
  widget QuoteWidget
- German user-facing label "Zitate" (English brand stays Quotes)

Pre-launch, no data migration needed.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-14 20:59:16 +02:00

80 lines
2 KiB
TypeScript

/**
* ManaLink — Deep-Link Resolution
*
* Maps app + collection + recordId to a full URL that opens
* the record's detail view in the target app.
*/
import { APP_URLS } from '@mana/shared-branding';
import type { AppIconId } from '@mana/shared-branding';
/** Route pattern per app and collection. Use {id} as placeholder. */
const DEEP_LINK_PATTERNS: Record<string, Record<string, string>> = {
todo: {
// Todo uses inline editing, no detail route — link to app root
tasks: '/',
projects: '/',
},
calendar: {
events: '/event/{id}',
calendars: '/',
},
contacts: {
contacts: '/contacts/{id}',
},
chat: {
conversations: '/chat/{id}',
messages: '/chat/{id}', // Navigate to conversation, not individual message
},
picture: {
images: '/app/board/{id}',
boards: '/app/board/{id}',
},
storage: {
files: '/',
folders: '/files/{id}',
},
presi: {
decks: '/deck/{id}',
slides: '/deck/{id}', // Navigate to the deck containing the slide
},
context: {
documents: '/documents/{id}',
spaces: '/spaces/{id}',
},
cards: {
decks: '/decks/{id}',
cards: '/decks/{id}', // Navigate to deck containing the card
},
music: {
songs: '/',
playlists: '/playlists/{id}',
},
clock: {
alarms: '/',
timers: '/',
},
quotes: {
favorites: '/',
},
};
/**
* Resolve a deep link URL for a cross-app record.
*
* @param app - App ID (e.g. 'todo', 'calendar')
* @param collection - Collection name (e.g. 'tasks', 'events')
* @param recordId - Record UUID
* @returns Full URL to the record's detail view, or app root as fallback
*/
export function resolveDeepLink(app: string, collection: string, recordId: string): string {
const isDev = typeof window !== 'undefined' && window.location.hostname === 'localhost';
const urls = APP_URLS[app as AppIconId];
if (!urls) return '#';
const baseUrl = isDev ? urls.dev : urls.prod;
const pattern = DEEP_LINK_PATTERNS[app]?.[collection] ?? '/';
const path = pattern.replace('{id}', recordId);
return `${baseUrl}${path}`;
}