Getting Started
App Providerglobal.d.tsThemesTypes
cn(...args)Text ParserUnits Converters
AnchorAvatarBreadcrumbBurgerButtonCardCarouselCheckerCodeColor PickerCommandConfettiCopyButtonDouble Helix WordsFloating IndicatorGroupHighlight TextIndicatorInputKbdLabelLoaderPaginationPassword RequirementPolymorphic SlotProgressProseRatingRunning AreaScroll AreaSheetsSkeletonSliderStackSvgTableTabsTextareaTimelineTimesToasterTooltipTyping WordsTypography
useClickOutsideuseClipboarduseDeviceInfouseDialoguseDidUpdateuseDirectionuseDisclosureuseDocumentTitleuseDocumentVisibilityuseElementInfouseEyeDropperuseFetchuseFullscreenuseGeoLocationuseHotkeysuseHoveruseIduseImagePopupuseInputStateuseIntersectionuseIntervaluseIsomorphicEffectuseListStateuseLocalStorageuseMeasureScrollbaruseMediaQueryuseMergedRefuseMouseuseMoveuseMutationObserveruseNetworkuseOpenStateuseOrientationuseOSusePaginationusePWAInstalleruseRandomColorsuseReducedMotionuseReloaduseResizeObserveruseScrollIntoViewuseStateHistoryuseTimeoutuseTouchuseTriggeruseUncontrolleduseValidatedStateuseViewportSizeuseWindowEventuseWindowScroll
Docs
Web
Hooks
useFetch
useEyeDropper

Allows users to select colors from anywhere on their screen.

useFullscreen

Manages entering and exiting fullscreen mode.


Edit this page on GitHub
  • Started
  • Utilities
  • Configuration
  • Components
  • Hooks
  • Examples
  • Github
  • Contributing
⌘+J

© 2025 oeri rights MIT


Designed in Earth-616

Built by oeri

useFetch

A simplified data fetching hook that manages loading, error, and response states.

Usage

Basic usage example to quickly see how the useFetch works.

Fetching
"use client";
import { cn } from "@/utils/cn";
import { Code } from "@/ui/code";
import { Stack } from "@/ui/stack";
import { Button } from "@/ui/button";
import { useFetch } from "@/hooks/use-fetch";

type Data = {
  userId: number;
  id: number;
  title: string;
};

export function UseFetchDemo() {
  const { data, loading, error, refetch, abort } = useFetch<Data[]>("https://jsonplaceholder.typicode.com/albums/");

  const uniqueUserData = data
    ? Object.values(
        data.reduce(
          (acc, data) => {
            if (!acc[data.userId]) {
              acc[data.userId] = data;
            }
            return acc;
          },
          {} as Record<number, Data>
        )
      )
    : null;

  if (error) return <p className="text-sm font-medium text-red-600">{error.message}</p>;
  return (
    <>
      <Stack className="relative size-full overflow-y-auto scrollbar">
        <Code code={uniqueUserData ? JSON.stringify(uniqueUserData, null, 2) : "Fetching"} className="h-max min-h-max w-full" />
        <Code label="data type:" samp={uniqueUserData} className="min-h-max w-full" />
      </Stack>

      <Stack align="end" className="absolute right-3 top-0">
        <span className={cn("size-4 rounded-full", !uniqueUserData || loading ? "bg-destructive" : "bg-conservative")} />
        <Button onClick={refetch} color="blue" variant="outline" className="w-24">
          Refetch
        </Button>
        <Button onClick={abort} color="red" variant="outline" className="w-24">
          Abort
        </Button>
      </Stack>
    </>
  );
}

Source Codes

Full working code example, including necessary markup and styles. You can copy and paste this code directly to start using the component immediately.

use-fetch.ts