Midday / packages /desktop-client /src /platform.ts
Jules
Final deployment with all fixes and verified content
c09f67c
import { isTauri } from "@tauri-apps/api/core";
import { listen } from "@tauri-apps/api/event";
export function isDesktopApp() {
return isTauri();
}
/**
* Returns the deep link scheme for the current environment.
* Controlled by NEXT_PUBLIC_DESKTOP_SCHEME env var.
*
* - Production: "midday"
* - Staging: "midday-staging"
* - Dev: "midday-dev"
*/
export function getDesktopScheme(): string {
return process.env.NEXT_PUBLIC_DESKTOP_SCHEME || "midday";
}
/**
* Returns the deep link base URL (scheme + "://") for the current environment.
*
* @example
* getDesktopSchemeUrl() // "midday://" in production, "midday-dev://" in dev
*/
export function getDesktopSchemeUrl(): string {
return `${getDesktopScheme()}://`;
}
export type DeepLinkHandler = (path: string) => void;
export async function listenForDeepLinks(handler: DeepLinkHandler) {
if (!isDesktopApp()) {
console.log("Deep links are only available in desktop app");
return () => {}; // No-op cleanup for non-desktop environments
}
try {
const unlisten = await listen<string>("deep-link-navigate", (event) => {
console.log("Deep link navigation received:", event.payload);
handler(event.payload);
});
console.log("Deep link listener registered");
return unlisten;
} catch (error) {
console.error("Failed to listen for deep links:", error);
return () => {};
}
}
/**
* Generate a deep link URL for the current environment.
* @param path The path to navigate to (without leading slash)
* @returns The deep link URL
*
* @example
* ```typescript
* // In production:
* createDeepLink('dashboard'); // "midday://dashboard"
* // In dev:
* createDeepLink('transactions/123'); // "midday-dev://transactions/123"
* ```
*/
export function createDeepLink(path: string): string {
const cleanPath = path.startsWith("/") ? path.slice(1) : path;
return `${getDesktopSchemeUrl()}${cleanPath}`;
}