ultisuite-client/lib/native/share.ts
R3D347HR4Y d6d18f911b
Some checks failed
E2E / Playwright e2e (push) Has been cancelled
Lots of stuff and mobile app
2026-06-17 00:13:28 +02:00

81 lines
2.2 KiB
TypeScript

/**
* Share send/receive for the native shells.
* - Receive: the OS hands shared content to the app (Android ACTION_SEND
* intent / iOS Share Extension), which the native layer queues; we drain it
* here and stash it for the compose/upload flow.
* - Send: push content to the OS share sheet via the `share_out` command.
*/
import { invoke } from "@/lib/native/bridge"
import { isTauriRuntime, SUITE_APP } from "@/lib/platform"
export type SharePayload = {
kind: string
text?: string | null
url?: string | null
files: string[]
mime?: string | null
}
const PENDING_SHARE_KEY = "ulti-pending-share"
/** Drain a pending inbound share payload (if any). */
export async function takePendingShare(): Promise<SharePayload | null> {
if (!isTauriRuntime()) return null
try {
return (await invoke<SharePayload | null>("plugin:ulti-core|share_take_pending")) ?? null
} catch {
return null
}
}
/** Stash a share payload for the in-app compose/upload flow to pick up. */
export function stashShare(payload: SharePayload) {
try {
sessionStorage.setItem(PENDING_SHARE_KEY, JSON.stringify(payload))
} catch {
/* ignore */
}
}
/** Read+clear a stashed share payload (consumed by compose/upload screens). */
export function consumeStashedShare(): SharePayload | null {
try {
const raw = sessionStorage.getItem(PENDING_SHARE_KEY)
if (!raw) return null
sessionStorage.removeItem(PENDING_SHARE_KEY)
return JSON.parse(raw) as SharePayload
} catch {
return null
}
}
/** In-app route to land on when content is shared *into* this app. */
export function shareLandingRoute(): string {
switch (SUITE_APP) {
case "mail":
return "/mail/inbox?compose=share"
case "drive":
return "/drive?upload=share"
case "contacts":
return "/contacts"
default:
return "/"
}
}
/** Share content out to other apps via the OS share sheet. */
export async function shareOut(payload: {
text?: string
url?: string
files?: string[]
mime?: string
}): Promise<void> {
if (!isTauriRuntime()) {
if (navigator.share && (payload.text || payload.url)) {
await navigator.share({ text: payload.text, url: payload.url })
}
return
}
await invoke("plugin:ulti-core|share_out", { payload })
}