Files
TREK/client/src/native/shareLink.ts
T
Maurice 6835fd7bf3 feat(mobile): page transitions, pull-to-refresh, share sheet and haptics
Page transitions: on the phone, pages move like a native navigation stack,
built on the View Transitions API (mobile/routeTransition.ts). A page opened
from another slides in from the trailing edge, back slides it away, and
switching between the dock's sections cross-fades while the dock stands
still. Lazy routes do not flash their skeleton: the swap waits, behind the
frozen snapshot, until the new page rendered. The edge-swipe back gesture
already moves the page and skips the transition. RTL mirrors the motion,
reduced motion and desktop get none.

Pull-to-refresh on the mobile dashboard: the page follows the finger with
resistance, ticks once past the threshold and re-reads trips and
notifications quietly, without a loading state.

Share: trip share and invite links and the journey link get a share button
next to copy, opening the system share sheet (Capacitor Share in the apps,
Web Share in browsers that have it).

Haptics: a selection click for switches and segmented controls, a tick when
a sheet is flung closed, and a firmer bump for the chat's long press.

Theme lint: this branch's new screens use the type and z-index tokens, the
Vacay company tint is a token, and the baseline is lowered to the new
counts.
2026-11-06 15:02:55 +01:00

34 lines
1.3 KiB
TypeScript

import { Share } from '@capacitor/share';
import { canShareText } from '../utils/fileShare';
import { isNativeApp } from './platform';
import { reportNativeFailure } from './reportFailure';
/**
* Handing a link to the system share sheet, the way a native app offers
* "Share…" next to "Copy": Messages, Mail, AirDrop, WhatsApp. Inside the apps
* through Capacitor's Share, in a browser through the Web Share API where it
* exists. Where neither does, `canShareLink` is false and the caller shows
* only the copy button.
*/
export function canShareLink(): boolean {
return isNativeApp() || canShareText();
}
/** True when a target took the link, false when the sheet was closed or failed. */
export async function shareLink(url: string, title?: string): Promise<boolean> {
try {
if (isNativeApp()) {
await Share.share({ url, title, dialogTitle: title });
return true;
}
await navigator.share({ url, title });
return true;
} catch (err) {
// Closing the sheet rejects too; only a real failure is worth a report.
const name = (err as { name?: string; message?: string } | null)?.name ?? '';
const message = (err as { message?: string } | null)?.message ?? '';
if (name !== 'AbortError' && !/cancel/i.test(message)) reportNativeFailure(err);
return false;
}
}