0.0.2 • Published 5 months ago

raycast-effect v0.0.2

Weekly downloads
-
License
ISC
Repository
github
Last release
5 months ago

Raycast Effect

This library allows you to create Raycast Extensions using Effect.

Getting Started

  1. Follow the "Create your first extension" guide
  2. Convert to a module (because I don't know how to properly package Typescript packages, plz help).
    • Add "type": "module", to your package.json
    • Change module to node16 in tsconfig.json
    • Add "moduleResolution": "node16", in tsconfig.json
  3. Create a ./src/lib/Runtime.ts file:

    import { NodeContext, NodeHttpClient } from "@effect/platform-node";
    import { Layer, ManagedRuntime } from "effect";
    import Raycast from "raycast-effect";
    
    // Compose your runtime here by adding services with Layer.merge
    export const Runtime = ManagedRuntime.make(
      pipe(Raycast.layer, Layer.merge(NodeContext.layer), Layer.merge(NodeHttpClient.layer)),
    );
    
    export const effectCommand = Raycast.command(Runtime);
    export const effectView = Raycast.view(Runtime);
    export const useEffectFn = Raycast.use(Runtime);

Creating Views

import { Effect } from 'effect'
import { effectView, useEffectFn } from './lib/Runtime.js'
import { LaunchProps, Arguments, Detail } from '@raycast/api'

export default effectView(
  Effect.fn(
    function* (params: LaunchProps<{ arguments: Arguments.ViewCommand }>) {
      // define a callback
      const callback = useEffectFn(
        Effect.fn(function* (/* define some arguments */) {
          // do some stuff
        },
          // Catch callback errors here with Effect.catchTag
        )
      )

      // return a view here
      return <Detail />
    },
    // Catch errors here with Effect.catchTag
  )
)

Creating Commands

import { Toast } from "@raycast/api";
import { effectCommand } from "./lib/Runtime.js";
import { Effect } from "effect";
import Raycast from "raycast-effect";

export default effectCommand(
  Effect.fn(
    function* () {
      const now = new Date();
      yield* Raycast.Clipboard.copy(now.toLocaleDateString());
      yield* Raycast.Feedback.showHUD("Copied date to clipboard");
    },
    Effect.catchTag("@raycast/ClipboardError", (e) =>
      Raycast.Feedback.showToast({
        title: "Something went wrong...",
        message: e.message,
        style: Toast.Style.Failure,
      }),
    ),
  ),
);
0.0.2

5 months ago

0.0.1

5 months ago