98 lines · 3.8 KB · TypeScript
RawDownload
import type { DesktopSnapShotState } from "@t3tools/contracts"; export type CaptureSetupStep = "access" | "shortcut"; export function captureSetupDesktopName(state: DesktopSnapShotState): string | undefined {  if (state.mode !== "portal") return undefined;  const desktop = state.linuxDesktop ?? captureSetupBackend(state);  switch (desktop) {    case "gnome":      return "GNOME";    case "kde":      return "KDE Plasma";    case "niri":      return "Niri";    case "hyprland":      return "Hyprland";    default:      return undefined;  }} export function captureSetupBackend(state: DesktopSnapShotState) {  if (state.mode !== "portal") return "direct";  if (state.linuxBackend === "niri") return "niri";  if (state.linuxBackend === "kde") return "kde";  if (state.linuxBackend === "hyprland") return "hyprland";  if (state.linuxBackend === "screenshot-portal") return "portal";  if (state.linuxBackend === "picker" && state.gnomeExtension?.status === "unsupported")    return "picker";  if (state.linuxBackend === "gnome-extension" || state.gnomeExtension) return "gnome";  return "picker";} export function captureSetupAccessReady(state: DesktopSnapShotState): boolean {  if (state.mode === "unavailable" || state.message) return false;  if (captureSetupBackend(state) === "gnome")    return state.gnomeExtension?.status === "enabled" && state.linuxBackend === "gnome-extension";  if (captureSetupBackend(state) === "kde") return state.kdeHelper?.status === "ready";  if (captureSetupBackend(state) === "hyprland") return state.hyprlandHelper?.status === "ready";  return true;} export function captureSetupMacPermissionsReady(  state: DesktopSnapShotState,  includeAccessibility: boolean,): boolean {  const permissions = state.macPermissions;  if (!permissions) return true;  return permissions.screenRecording && (!includeAccessibility || permissions.accessibility);} export function captureSetupCheckMessage(state: DesktopSnapShotState): string {  const backend = captureSetupBackend(state);  const gnome = backend === "gnome";  if (    state.message ||    (gnome && state.gnomeExtension?.status === "error") ||    (backend === "kde" && state.kdeHelper?.status === "error") ||    (backend === "hyprland" && state.hyprlandHelper?.status === "error")  )    return "Still unable to check access. See Advanced for help.";  if (captureSetupBackend(state) === "picker") return "Ready. You'll choose a window each time.";  if (gnome && state.gnomeExtension?.status === "restart-required")    return "Still waiting for you to sign out and back in.";  return captureSetupAccessReady(state)    ? "Ready. Continue to choose your shortcut."    : "Not ready yet. Finish the step above.";} export function captureSetupShortcutReady(state: DesktopSnapShotState, unsaved: boolean): boolean {  if (unsaved || !captureSetupAccessReady(state)) return false;  if (state.linuxBackend === "hyprland") return Boolean(state.shortcutActionRegistered);  return state.linuxBackend === "niri"    ? Boolean(state.shortcutBinding)    : state.shortcutRegistered || Boolean(state.shortcutPending);} export function captureSetupInitialStep(  state: DesktopSnapShotState,  requested: CaptureSetupStep | "resume" = "resume",): CaptureSetupStep {  if (!captureSetupAccessReady(state)) return "access";  if (requested === "resume") {    // A disabled native backend hasn't checked system permissions yet. A picker    // still needs its explanation; neither is proof of active-window access.    if (      (state.mode === "direct" && !state.shortcutRegistered) ||      captureSetupBackend(state) === "picker"    )      return "access";    return "shortcut";  }  return requested;} export function captureSetupShouldDisableOnClose(wasEnabled: boolean, completed: boolean): boolean {  return !wasEnabled && !completed;}