Skip to component content
Presentation103 / 155

Toast

Show dismissible feedback and let the user replay it.

Example
Changes saved
Source
Toast.tsxtsx
import { useState } from "react";
import { Button, Picker, Text, Toast, VStack } from "@/ohmygui";

export default function Example() {
  const [visible, setVisible] = useState(true);
  const [message, setMessage] = useState("Changes saved");
  const [type, setType] = useState<"danger" | "info" | "success" | "warning">("success");
  const [duration, setDuration] = useState("6000");
  const [placement, setPlacement] = useState<"inline" | "bottom-end" | "bottom-center" | "top-end">("inline");
  return (
    <VStack gap="md" align="stretch">
      <Picker label="Toast type" value={type} onChange={(event) => setType(event.currentTarget.value as typeof type)} items={["info", "success", "warning", "danger"].map((value) => ({ value, label: value }))} />
      <Picker label="Auto dismiss" value={duration} onChange={(event) => setDuration(event.currentTarget.value)} items={[{ value: "0", label: "Manual" }, { value: "3000", label: "3 seconds" }, { value: "6000", label: "6 seconds" }]} />
      <Picker label="Placement" value={placement} onChange={(event) => setPlacement(event.currentTarget.value as typeof placement)} items={[{ value: "inline", label: "Inline" }, { value: "top-end", label: "Top end" }, { value: "bottom-end", label: "Bottom end" }, { value: "bottom-center", label: "Bottom center" }]} />
      {visible ? (
        <Toast
          message={message}
          type={type}
          duration={Number(duration)}
          placement={placement}
          actionLabel="Undo"
          onAction={() => setMessage("Save undone")}
          onDismiss={() => setVisible(false)}
        />
      ) : (
        <Button onClick={() => setVisible(true)}>Show toast</Button>
      )}
      {duration === "0" && <Text as="p" variant="metadata" color="muted">Manual dismissal is enabled.</Text>}
    </VStack>
  );
}