Add 'apps/mobile/' from commit '5fa30f365f21531094cd4d2045042bb4f1370ac3'

git-subtree-dir: apps/mobile
git-subtree-mainline: 86f8987dff
git-subtree-split: 5fa30f365f
This commit is contained in:
2026-08-16 21:42:59 -04:00
222 changed files with 23436 additions and 0 deletions
+66
View File
@@ -0,0 +1,66 @@
import * as Linking from "expo-linking";
export type ShortcutAction = "clock-in" | "clock-out" | "open-timer";
export type ParsedShortcut = {
action: ShortcutAction;
title: string;
clientId: string;
};
function queryParam(value: string | string[] | undefined): string {
if (Array.isArray(value)) return value[0] ?? "";
return value ?? "";
}
function normalizeShortcutPath(hostname: string | null, path: string | null): string | null {
const host = (hostname ?? "").replace(/^\/+|\/+$/g, "");
const segment = (path ?? "").replace(/^\/+|\/+$/g, "");
if (host === "shortcuts" && segment) {
return segment;
}
const combined = [host, segment].filter(Boolean).join("/");
const match = combined.match(/(?:^|\/)shortcuts\/(clock-in|clock-out)$/);
if (match?.[1]) return match[1];
if (combined === "clock-in" || combined === "clock-out") {
return combined;
}
return null;
}
/** Parse `beenvoice://shortcuts/clock-in` and related URLs from Shortcuts / Siri. */
export function parseShortcutUrl(url: string | null | undefined): ParsedShortcut | null {
if (!url) return null;
const parsed = Linking.parse(url);
if (parsed.scheme !== "beenvoice") return null;
const path = (parsed.path ?? "").replace(/^\/+/, "");
const host = parsed.hostname ?? "";
if (path === "timer" || host === "timer") {
return { action: "open-timer", title: "", clientId: "" };
}
const shortcutAction = normalizeShortcutPath(host, path);
if (shortcutAction === "clock-in" || shortcutAction === "clock-out") {
return {
action: shortcutAction,
title: queryParam(parsed.queryParams?.title),
clientId: queryParam(parsed.queryParams?.clientId),
};
}
return null;
}
export const SHORTCUT_URLS = {
timer: "beenvoice://timer",
openTimer: "beenvoice://timer",
clockIn: "beenvoice://shortcuts/clock-in",
clockOut: "beenvoice://shortcuts/clock-out",
} as const;