Delete Resource
@photon-ai/kumo-solid
import { createSignal } from "solid-js";
import { Button } from "@photon-ai/kumo-solid";
import { DeleteResource } from "~/components/kumo/delete-resource";

export function DeleteResourceBasicDemo() {
  const [open, setOpen] = createSignal(false);
  const [isDeleting, setIsDeleting] = createSignal(false);

  const handleDelete = async () => {
    setIsDeleting(true);
    await new Promise((resolve) => setTimeout(resolve, 2000));
    setIsDeleting(false);
    setOpen(false);
  };

  return (
    <>
      <Button variant="destructive" onClick={() => setOpen(true)}>
        Delete Zone
      </Button>
      <DeleteResource
        open={open()}
        onOpenChange={setOpen}
        resourceType="Zone"
        resourceName="example.com"
        onDelete={handleDelete}
        isDeleting={isDeleting()}
      />
    </>
  );
}

Installation

DeleteResource is a block: a source-distributed Solid component that you own and customize.

The published Kumo CLI currently emits React source. Until a Solid-aware installer is available, copy this block from the repository.

1. Copy the Solid block directory

packages/kumo-docs-astro/src/components/kumo/delete-resource/

2. Import from your local path

import { DeleteResource } from "./components/kumo/delete-resource/delete-resource";

Why blocks? Blocks give you full ownership of the code, allowing you to customize deletion flows to fit your specific needs. They’re ideal for critical actions that often need project-specific modifications.

Usage

import { createSignal } from "solid-js";
import { DeleteResource } from "./components/kumo/delete-resource/delete-resource";
import { Button } from "@photon-ai/kumo-solid";

export default function Example() {
  const [open, setOpen] = createSignal(false);
  const [isDeleting, setIsDeleting] = createSignal(false);

  const handleDelete = async () => {
    setIsDeleting(true);
    try {
      await deleteZone("example.com");
      setOpen(false);
    } finally {
      setIsDeleting(false);
    }
  };

  return (
    <>
      <Button variant="destructive" onClick={() => setOpen(true)}>
        Delete Zone
      </Button>
      <DeleteResource
        open={open()}
        onOpenChange={setOpen}
        resourceType="Zone"
        resourceName="example.com"
        onDelete={handleDelete}
        isDeleting={isDeleting()}
      />
    </>
  );
}

Examples

Worker Deletion

Works with any resource type - just change the resourceType and resourceName props.

import { createSignal } from "solid-js";
import { Button } from "@photon-ai/kumo-solid";
import { DeleteResource } from "~/components/kumo/delete-resource";

export function DeleteResourceWorkerDemo() {
  const [open, setOpen] = createSignal(false);
  const [isDeleting, setIsDeleting] = createSignal(false);

  const handleDelete = async () => {
    setIsDeleting(true);
    await new Promise((resolve) => setTimeout(resolve, 2000));
    setIsDeleting(false);
    setOpen(false);
  };

  return (
    <>
      <Button variant="destructive" onClick={() => setOpen(true)}>
        Delete Worker
      </Button>
      <DeleteResource
        open={open()}
        onOpenChange={setOpen}
        resourceType="Worker"
        resourceName="api-gateway-worker"
        onDelete={handleDelete}
        isDeleting={isDeleting()}
      />
    </>
  );
}

Error State

Use the errorMessage prop to show an error message.

import { createSignal } from "solid-js";
import { Button } from "@photon-ai/kumo-solid";
import { DeleteResource } from "~/components/kumo/delete-resource";

export function DeleteResourceErrorDemo() {
  const [open, setOpen] = createSignal(false);
  const [isDeleting, setIsDeleting] = createSignal(false);
  const [errorMsg, setErrorMsg] = createSignal<string>("");

  const handleDelete = async () => {
    setErrorMsg("");
    setIsDeleting(true);
    await new Promise((resolve) => setTimeout(resolve, 2000));
    setIsDeleting(false);
    setErrorMsg("Something went wrong");
  };

  return (
    <>
      <Button variant="destructive" onClick={() => setOpen(true)}>
        Delete Zone
      </Button>
      <DeleteResource
        open={open()}
        onOpenChange={setOpen}
        resourceType="Zone"
        resourceName="example.com"
        onDelete={handleDelete}
        isDeleting={isDeleting()}
        errorMessage={errorMsg()}
      />
    </>
  );
}

API Reference

PropTypeDefaultDescription
size"sm" | "base""base"-
open*boolean-Whether the dialog is open
resourceType*string-The type of resource being deleted (e.g., "Zone", "Worker", "KV Namespace")
resourceName*string-The name of the specific resource being deleted
isDeletingboolean-Whether the delete action is in progress
caseSensitiveboolean-Whether the confirmation input should be case-sensitive (default: true)
deleteButtonTextstring-Custom delete button text (defaults to "Delete {resourceType}")
classNamestring-Additional className for the dialog
errorMessagestring-Error message to display if the delete action fails