diff --git a/src/App.tsx b/src/App.tsx index fa0bcf1..0bc85c1 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,51 +1,13 @@ -import { useEffect, useState } from "react"; import "./App.css"; import { Settings } from "./components/settings/Settings"; -import { - checkAccessibilityPermissions, - requestAccessibilityPermissions, -} from "tauri-plugin-macos-permissions-api"; import HandyTextLogo from "./components/icons/HandyTextLogo"; +import AccessibilityPermissions from "./components/AccessibilityPermissions"; function App() { - const [hasAccessibility, setHasAccessibility] = useState(false); - - const checkPermissions = () => { - checkAccessibilityPermissions().then((hasPermissions) => { - if (!hasPermissions) { - requestAccessibilityPermissions().then((permissions) => { - setHasAccessibility(permissions); - }); - return; - } - setHasAccessibility(hasPermissions); - }); - }; - - useEffect(() => { - checkPermissions(); - }, []); - return ( -
- {!hasAccessibility && ( -
-
-
-

- Accessibility permissions are required for keyboard shortcuts. -

-
- -
-
- )} +
+
); diff --git a/src/components/AccessibilityPermissions.tsx b/src/components/AccessibilityPermissions.tsx new file mode 100644 index 0000000..151a959 --- /dev/null +++ b/src/components/AccessibilityPermissions.tsx @@ -0,0 +1,97 @@ +import { useEffect, useState } from "react"; +import { + checkAccessibilityPermissions, + requestAccessibilityPermissions, +} from "tauri-plugin-macos-permissions-api"; + +// Define permission state type +type PermissionState = "request" | "verify" | "granted"; + +// Define button configuration type +interface ButtonConfig { + text: string; + className: string; +} + +const AccessibilityPermissions: React.FC = () => { + const [hasAccessibility, setHasAccessibility] = useState(false); + const [permissionState, setPermissionState] = + useState("request"); + + // Check permissions without requesting + const checkPermissions = async (): Promise => { + const hasPermissions: boolean = await checkAccessibilityPermissions(); + setHasAccessibility(hasPermissions); + setPermissionState(hasPermissions ? "granted" : "verify"); + return hasPermissions; + }; + + // Handle the unified button action based on current state + const handleButtonClick = async (): Promise => { + if (permissionState === "request") { + try { + await requestAccessibilityPermissions(); + // After system prompt, transition to verification state + setPermissionState("verify"); + } catch (error) { + console.error("Error requesting permissions:", error); + setPermissionState("verify"); + } + } else if (permissionState === "verify") { + // State is "verify" - check if permission was granted + await checkPermissions(); + } + }; + + // On app boot - check permissions + useEffect(() => { + const initialSetup = async (): Promise => { + const hasPermissions: boolean = await checkAccessibilityPermissions(); + setHasAccessibility(hasPermissions); + setPermissionState(hasPermissions ? "granted" : "request"); + }; + + initialSetup(); + }, []); + + if (hasAccessibility) { + return null; + } + + // Configure button text and style based on state + const buttonConfig: Record = { + request: { + text: "Grant", + className: + "px-2 py-1 text-sm font-semibold bg-mid-gray/10 border border-mid-gray/80 hover:bg-logo-primary/10 rounded cursor-pointer hover:border-logo-primary", + }, + verify: { + text: "Verify", + className: + "bg-gray-100 hover:bg-gray-200 text-gray-800 font-medium py-1 px-3 rounded text-sm flex items-center justify-center cursor-pointer", + }, + granted: null, + }; + + const config = buttonConfig[permissionState] as ButtonConfig; + + return ( +
+
+
+

+ Please grant accessibility permissions for Handy +

+
+ +
+
+ ); +}; + +export default AccessibilityPermissions; diff --git a/src/components/settings/Settings.tsx b/src/components/settings/Settings.tsx index a0cfce8..70192b7 100644 --- a/src/components/settings/Settings.tsx +++ b/src/components/settings/Settings.tsx @@ -4,12 +4,10 @@ import { KeyboardShortcuts } from "./KeyboardShortcuts"; export const Settings: React.FC = () => { return ( -
-
-
-

Keyboard Shortcuts

- -
+
+
+

Keyboard Shortcuts

+
);