| 1 | import * as Context from "effect/Context"; |
| 2 | import * as Effect from "effect/Effect"; |
| 3 | import * as Layer from "effect/Layer"; |
| 4 | import * as Path from "effect/Path"; |
| 5 | import * as Electron from "electron"; |
| 6 | import * as DesktopEnvironment from "../app/DesktopEnvironment.ts"; |
| 7 | import { MacPermissionHelper } from "./MacPermissionHelper.ts"; |
| 8 | import type { MacPermission } from "./MacPermission.ts"; |
| 9 | |
| 10 | export 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 | |
| 21 | export 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 | ); |