import type { DesktopTheme } from "@t3tools/contracts"; import * as Context from "effect/Context"; import * as Effect from "effect/Effect"; import * as Layer from "effect/Layer"; import * as Scope from "effect/Scope"; import * as Electron from "electron"; export interface ElectronThemeShape { readonly shouldUseDarkColors: Effect.Effect; readonly setSource: (theme: DesktopTheme) => Effect.Effect; readonly onUpdated: (listener: () => void) => Effect.Effect; } export class ElectronTheme extends Context.Service()( "t3/desktop/electron/Theme", ) {} const make = ElectronTheme.of({ shouldUseDarkColors: Effect.sync(() => Electron.nativeTheme.shouldUseDarkColors), setSource: (theme) => Effect.suspend(() => { Electron.nativeTheme.themeSource = theme; return Effect.void; }), onUpdated: (listener) => Effect.acquireRelease( Effect.suspend(() => { Electron.nativeTheme.on("updated", listener); return Effect.void; }), () => Effect.suspend(() => { Electron.nativeTheme.removeListener("updated", listener); return Effect.void; }), ), }); export const layer = Layer.succeed(ElectronTheme, make);