mirror of
https://github.com/Memo-2023/mana-monorepo.git
synced 2026-05-17 02:59:40 +02:00
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>
80 lines
2 KiB
TypeScript
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}`;
|
|
}
|