Skip to content
+

API Client

React hooks and client for communicating with @stoked-ui/media-api, built on TanStack Query.

Introduction

The Media API client provides a set of React hooks for interacting with a @stoked-ui/media-api backend. Built on TanStack Query, it handles caching, background refetching, and optimistic updates out of the box.

Setup

import { QueryClient, QueryClientProvider } from '@tanstack/react-query';

const queryClient = new QueryClient();

function App() {
  return (
    <QueryClientProvider client={queryClient}>
      <MyApp />
    </QueryClientProvider>
  );
}

Hooks

useMediaUpload

Upload media files with progress tracking and resumable support.

import { useMediaUpload } from '@stoked-ui/media';

function UploadForm() {
  const { mutate: upload, isLoading, progress } = useMediaUpload();

  const handleUpload = (file: File) => {
    upload({ file, metadata: { title: file.name } });
  };

  return (
    <div>
      <input type="file" onChange={(e) => handleUpload(e.target.files[0])} />
      {isLoading && <p>Uploading: {progress}%</p>}
    </div>
  );
}

useMediaList

Fetch a paginated list of media items.

import { useMediaList } from '@stoked-ui/media';

function MediaLibrary() {
  const { data, isLoading, error } = useMediaList({ page: 1, limit: 20 });

  if (isLoading) return <p>Loading...</p>;
  if (error) return <p>Error loading media</p>;

  return (
    <ul>
      {data.items.map((item) => (
        <li key={item.id}>{item.title}</li>
      ))}
    </ul>
  );
}

useMediaItem

Fetch a single media item by ID.

import { useMediaItem } from '@stoked-ui/media';

function MediaDetail({ id }) {
  const { data: item, isLoading } = useMediaItem(id);

  if (isLoading) return <p>Loading...</p>;

  return <h1>{item.title}</h1>;
}

useMediaUpdate

Update media item metadata.

import { useMediaUpdate } from '@stoked-ui/media';

function EditForm({ id }) {
  const { mutate: update } = useMediaUpdate();

  const handleSave = (title: string) => {
    update({ id, data: { title } });
  };

  return <button onClick={() => handleSave('New Title')}>Save</button>;
}

useMediaDelete

Delete a media item.

import { useMediaDelete } from '@stoked-ui/media';

function DeleteButton({ id }) {
  const { mutate: remove } = useMediaDelete();

  return <button onClick={() => remove(id)}>Delete</button>;
}