142 lines · 5.9 KB · TypeScript
RawDownload
import type { ClientSettingsPatch, DesktopSnapShotState, SnapShotSound } from "@t3tools/contracts";import {  captureSetupBackend,  captureSetupDesktopName,  captureSetupAccessReady,  captureSetupMacPermissionsReady,} from "./SnapShotSetupDialog.logic"; export function snapShotStatus(state: DesktopSnapShotState | null, enabled: boolean): string {  if (!state) return "Checking snapshots…";  if (state.mode === "unavailable") return state.message ?? "Not supported on this platform.";  if (!enabled) return "Turn this on to set up snapshots.";  return snapShotSetupSummary(state, enabled);} export function snapShotSetupSummary(state: DesktopSnapShotState, enabled: boolean): string {  if (state.message) return "Capture needs attention";  if (state.linuxBackend === "hyprland" && state.hyprlandHelper?.status !== "ready")    return state.hyprlandHelper?.status === "error"      ? "Check capture access in setup"      : "Install the capture helper to continue";  if (captureSetupBackend(state) === "gnome" && state.gnomeExtension?.status !== "enabled")    return "Set up active-window snapshots";  if (captureSetupBackend(state) === "kde" && state.kdeHelper?.status !== "ready")    return state.kdeHelper?.status === "error"      ? "Check capture access in setup"      : "Install the capture helper to continue";  if (captureSetupBackend(state) === "picker")    return "Manual capture only — you'll choose a window each time";  if (!enabled) return "Enable capture to continue";  if (state.shortcutPending)    return state.linuxBackend === "hyprland"      ? "Connecting your shortcut…"      : "Waiting for shortcut permission";  if (state.shortcutVerified) return "Ready to capture";  if (state.linuxBackend === "niri" && state.shortcutBinding)    return "Use your shortcut from another app";  if (state.linuxBackend === "hyprland" && state.shortcutActionRegistered)    return "Use your shortcut from another app";  if (state.shortcutRegistered) return state.shortcutLabel ? "Ready to capture" : "Shortcut saved";  return "Finish shortcut setup";} export function snapShotShortcutStatus(state: DesktopSnapShotState | null): string | null {  if (!state) return null;  if (state.linuxBackend === "hyprland") return state.shortcutMessage;  if (state.shortcutPending) return "Approve the shortcut permission prompt to continue.";  if (state.shortcutRegistered) return state.mode === "portal" ? null : "Shortcut saved.";  return state.shortcutMessage;} export function snapShotSetupButtonLabel(state: DesktopSnapShotState | null): string {  if (!state) return "Continue setup";  if (captureSetupAccessReady(state)) return "Manage capture";  const desktop = captureSetupDesktopName(state);  return desktop ? `Set up ${desktop} capture` : "Continue setup";} // Windows needs no permissions or setup: turning capture on is enough. macOS setup// has nothing left to manage once permissions and the shortcut are in place; the// shortcut row stays editable inline. Revoking a permission brings the button back// as "Continue setup" through the state message.export function snapShotSetupComplete(  state: DesktopSnapShotState | null,  includeAccessibility: boolean,): boolean {  if (state?.windows) return true;  return (    state?.macPermissions !== undefined &&    captureSetupAccessReady(state) &&    captureSetupMacPermissionsReady(state, includeAccessibility) &&    state.shortcutRegistered  );} export type SnapShotSoundSelection = SnapShotSound | "off"; export function snapShotFeedbackUnavailableMessage(  state: DesktopSnapShotState | null,): string | undefined {  if (state?.mode !== "portal" || state.linuxFeedbackAvailable) return undefined;  if (state.linuxBackend === "hyprland")    return state.hyprlandHelper?.status === "ready"      ? "Capture effects aren't available on this desktop."      : "Install or update the capture helper to enable effects.";  if (state.linuxBackend === "niri") return "Capture effects aren't available on Niri.";  if (state.linuxBackend === "kde")    return state.kdeHelper?.status === "ready"      ? "Capture effects aren't available on this desktop."      : "Install or update the capture helper to enable effects.";  return state.linuxBackend === "gnome-extension"    ? "Update the GNOME extension, then sign out and back in to enable effects."    : captureSetupBackend(state) === "gnome"      ? "Finish extension setup to enable effects."      : "Capture effects aren't available on this desktop.";} export function snapShotDescription(state: DesktopSnapShotState | null): string {  return state?.mode === "portal" && captureSetupBackend(state) === "picker"    ? "Automatic capture isn't available here. Choose a window instead."    : "Capture a window and attach it to your current draft.";} export function snapShotAccessibilityUnavailableMessage(  state: DesktopSnapShotState | null,): string | undefined {  if (state?.mode !== "portal") return undefined;  if (state.linuxBackend === "picker" || state.linuxBackend === "screenshot-portal")    return "This desktop only provides a screenshot.";  return undefined;} export function snapShotUnavailableMessage(hasBridge: boolean): string | undefined {  if (hasBridge) return undefined;  return typeof window !== "undefined" && window.desktopBridge    ? "Update the desktop app to use snapshots."    : "Only available in the desktop app.";} export function snapShotSoundPatch(sound: SnapShotSoundSelection): ClientSettingsPatch {  return sound === "off"    ? { snapShotPlaySound: false }    : { snapShotPlaySound: true, snapShotSound: sound };} export function createRecordingRequestTracker() {  let currentRequest: symbol | null = null;   return {    tryBegin() {      if (currentRequest) return null;      currentRequest = Symbol();      return currentRequest;    },    clear() {      currentRequest = null;    },    owns(request: symbol) {      return currentRequest === request;    },  };}