Skip to component content
Behavior141 / 155

Refreshable

Run a local asynchronous refresh with pending-state feedback.

Example

Orders · refreshed 1 time

Source
Refreshable.tsxtsx
import { useState } from "react";
import { Button, Refreshable, Text, VStack } from "@/ohmygui";

export default function Example() {
  const [version, setVersion] = useState(1);
  const [failNext, setFailNext] = useState(false);
  return (
    <VStack gap="sm" align="stretch">
      <Button
        size="sm"
        variant="outline"
        onClick={() => setFailNext(true)}
        disabled={failNext}
      >
        Make next refresh fail
      </Button>
      <Refreshable
        label="Refresh orders"
        onRefreshEvent={async () => {
          await new Promise((resolve) => setTimeout(resolve, 400));
          if (failNext) {
            setFailNext(false);
            throw new Error("Refresh failed");
          }
          setVersion((value) => value + 1);
        }}
      >
        <Text as="p">
          Orders · refreshed {version} {version === 1 ? "time" : "times"}
        </Text>
      </Refreshable>
    </VStack>
  );
}