1.1.0 • Published 10 days ago

sanity-plugin-webhooks v1.1.0

Weekly downloads
-
License
MIT
Repository
github
Last release
10 days ago

sanity-plugin-webhooks

Latest Stable Version Weekly Downloads License Made by Winter

This is a Sanity Studio v3 plugin.

What is it?

A tool that lists your Sanity webhooks and displays their events along with status, duration and response.

Screenshot of the tool in action

Installation

npm install sanity-plugin-webhooks

Usage

Add it as a plugin in sanity.config.ts:

import { defineConfig } from 'sanity';
import { webhooks } from 'sanity-plugin-webhooks';

export default defineConfig({
  //...
  plugins: [webhooks()]
});

This will render a list of webhooks and for each webhook show a basic list of attempts and their status. You will also be able to see the exact response that the webhook received.

Customize the list of events

To fully utilize this tool and make it as useful as possible for the Studio editors you can inject a custom component to render details about the webhook response.

For example, given a JSON response such as the following which comes from a Next.js revalidation API route:

{
  "success": true,
  "message": "Revalidated 1 tag",
  "tags": ["page-about"],
  "received": {
    "_id": "f5e882dc-6713-4b0e-988a-03cb8ae453b1",
    "_type": "page",
    "slug": {
      "_type": "slug",
      "current": "about"
    }
  }
}

You can inject a custom result component such as this:

import { Stack } from '@sanity/ui';
import {
  BadgeRow,
  type WebhookBodyComponentProps
} from 'sanity-plugin-webhooks';

export function WebhookBody({ attempt }: WebhookBodyComponentProps) {
  // The result body is the response from the webhook endpoint
  const resultBody = attempt.resultBody;

  return (
    <>
      {resultBody?.message}

      {resultBody?.tags?.length > 0 && (
        <Stack space={[2, 2, 2]}>
          {resultBody.tags?.length > 0 && (
            <BadgeRow heading="Tags" badges={resultBody.tags} />
          )}
        </Stack>
      )}

      {resultBody?.received?.slug?.current && (
        <Stack space={[2, 2, 2]}>
          <BadgeRow
            heading="Triggered By"
            badges={[resultBody.received._type]}
            tone="default"
          />

          <BadgeRow
            heading="Slug"
            badges={[resultBody.received.slug.current]}
            tone="default"
          />
        </Stack>
      )}
    </>
  );
}

Then add the component to the plugin config like this:

import { defineConfig } from 'sanity';
import { webhooks } from 'sanity-plugin-webhooks';
import { WebhookBody } from './components/WebhookBody';

export default defineConfig({
  //...
  plugins: [webhooks({ webhookBodyComponent: WebhookBody })]
});

This will result in a more comprehensive event log:

webhooks-customized

License

MIT © Winter Agency

Develop & test

This plugin uses @sanity/plugin-kit with default configuration for build & watch scripts.

See Testing a plugin in Sanity Studio on how to run this plugin with hotreload in the studio.

Release new version

Run "CI & Release" workflow. Make sure to select the main branch and check "Release new version".

Semantic release will only release on configured branches, so it is safe to run release on any branch.