1import * as Context from "effect/Context";
2import * as Effect from "effect/Effect";
3import * as Layer from "effect/Layer";
4import * as Path from "effect/Path";
5import * as Electron from "electron";
6import * as DesktopEnvironment from "../app/DesktopEnvironment.ts";
7import { MacPermissionHelper } from "./MacPermissionHelper.ts";
8import type { MacPermission } from "./MacPermission.ts";
9
10export class MacPermissions extends Context.Service<
11 MacPermissions,
12 {
13 readonly showHelper: (
14 permission: MacPermission,
15 owner: Electron.BrowserWindow | null,
16 isGranted?: () => boolean | Promise<boolean>,
17 ) => Effect.Effect<void>;
18 }
19>()("@t3tools/desktop/permissions/MacPermissions") {}
20
21export const layer = Layer.effect(
22 MacPermissions,
23 Effect.gen(function* () {
24 const environment = yield* DesktopEnvironment.DesktopEnvironment;
25 const path = yield* Path.Path;
26 const helper = new MacPermissionHelper();
27 yield* Effect.addFinalizer(() => Effect.sync(() => helper.close()));
28 return MacPermissions.of({
29 showHelper: Effect.fn("MacPermissions.showHelper")(function* (permission, owner, isGranted) {
30 if (environment.platform !== "darwin" || !environment.isPackaged) return;
31 yield* Effect.tryPromise(() =>
32 helper.show(
33 permission,
34 path.join(environment.dirname, "mac-permission-preload.cjs"),
35 owner,
36 environment.resolveResourcePathCandidates("icon.png"),
37 isGranted,
38 ),
39 ).pipe(
40 Effect.catch((cause) => Effect.logWarning("Could not show permission helper", cause)),
41 );
42 }),
43 });
44 }),
45);