Skip to content
We've just launched - check out our docs! đź“—
  • React
  • Asset
  • useAsset

useAsset

Hook for retrieving an Asset based on a unique identifier.

import { useAsset } from '@livepeer/react';

Usage

The following examples assume an Asset was created via useCreateAsset or directly via a provider's API/dashboard. If a falsy asset ID is provided, the query will be skipped.

import { useAsset } from '@livepeer/react';
 
function App() {
  const { data: asset } = useAsset(asset?.id);
}

Return Value

The return value is partially based on React Query, with some return types aggregated for simplicity.

{
  data?: Asset,
  error?: Error,
  status: 'idle' | 'loading' | 'success' | 'error',
  isError: boolean,
  isFetched: boolean,
  isFetching: boolean,
  isIdle: boolean,
  isLoading: boolean,
  isRefetching: boolean,
  isSuccess: boolean,
  refetch: (options: RefetchOptions) => Promise<UseQueryResult>,
}

Configuration

assetId

Asset identifier. Can also be a string passed as the only parameter.

import { useAsset } from '@livepeer/react';
 
function App() {
  const { data: asset } = useAsset({
    assetId,
  });
}

UseQueryOptions

The useAsset hook also supports any React Query useQuery options, such as refetchInterval or enabled. These override any configs passed by default by the internal hook.

import { useAsset } from '@livepeer/react';
 
function App() {
  const { data: asset } = useAsset({
    assetId,
    refetchInterval: (asset) => (!asset?.playbackUrl ? 5000 : false),
  });
}

SSR

Next.js

The useAsset hook also comes with a React Query prefetch query, prefetchAsset, which makes it easy to prefetch data for server-side rendering.

First, you add a getStaticProps function to the page which you want to prefetch data on. The props should match the useAsset hook to ensure that the correct data is prefetched.

// pages/demo.tsx
import { prefetchAsset, studioProvider } from '@livepeer/react';
 
export const getStaticProps = async () => {
  const dehydratedState = await prefetchAsset(
    { assetId },
    { provider: studioProvider({ apiKey: 'yourStudioApiKey' }) },
  );
 
  return {
    props: {
      dehydratedState,
    },
    revalidate: 600,
  };
};

We need to update the _app.tsx to pass the dehydratedState in pageProps to the LivepeerConfig. We also move the livepeerClient into a useMemo hook so that a new client is created on each request.

// pages/_app.tsx
import {
  LivepeerConfig,
  createReactClient,
  studioProvider,
} from '@livepeer/react';
import type { AppProps } from 'next/app';
 
import { useMemo } from 'react';
 
function App({ Component, pageProps }: AppProps<{ dehydratedState: string }>) {
  // we create a new livepeer client on each request so data is
  // not shared between users
  const livepeerClient = useMemo(
    () =>
      createReactClient({
        provider: studioProvider({
          apiKey: process.env.NEXT_PUBLIC_STUDIO_API_KEY,
        }),
      }),
    [],
  );
 
  return (
    <LivepeerConfig
      dehydratedState={pageProps?.dehydratedState}
      client={livepeerClient}
    >
      <Component {...pageProps} />
    </LivepeerConfig>
  );
}

That's it! You now have data prefetching on the server, which is passed to the browser and used to hydrate the initial query client.

Other Frameworks

The process is very similar for other frameworks, with the exception that there is a clearClient boolean which should be used to ensure that the client cache is not reused across users.

import { prefetchAsset, studioProvider } from '@livepeer/react';
 
export const handleRequest = async (req, res) => {
  const dehydratedState = await prefetchAsset(
    {
      assetId,
      clearClient: true,
    },
    { provider: studioProvider({ apiKey: 'yourStudioApiKey' }) },
  );
 
  // sanitize the custom SSR generated data
  // https://medium.com/node-security/the-most-common-xss-vulnerability-in-react-js-applications-2bdffbcc1fa0
 
  res.send(`
    <html>
      <body>
        <div id="root">${html}</div>
        <script>
          window.__REACT_QUERY_STATE__ = ${yourSanitizedDehydratedState};
        </script>
      </body>
    </html>
  `);
};