A React Native component to generate rich link previews by fetching metadata (title, description, images) from URLs. Easily integrate customizable and lightweight link previews into your app.
npm install react-native-preview-urluseUrlPreview hook and a customizable component.azizbecha-link-preview-api available on GitHub at https://github.com/azizbecha/link-preview-api.You can use the API for free without an API key or host it yourself if you prefer.
- Fetches metadata (title, description, images, favicons, etc.) from URLs
- Customizable preview component with styles and fallback support
- Supports timeout and error handling
- Handles URL validation and loading states
``bash`
npm install react-native-preview-urlor
yarn add react-native-preview-url
`tsx
import { useUrlPreview } from 'react-native-preview-url';
const { loading, data, error } = useUrlPreview('https://github.com');
`
`tsx
import React from 'react';
import { LinkPreview } from 'react-native-preview-url';
export const Example = () => (
timeout={3000} // optional, default timeout in ms
onSuccess={(metadata) => console.log(metadata)}
onError={(error) => console.error(error)}
onPress={() => console.log('Pressed preview')}
containerStyle={{ margin: 16, borderRadius: 8, backgroundColor: '#fff' }}
imageStyle={{ borderRadius: 8, height: 150 }}
titleStyle={{ fontSize: 18, fontWeight: 'bold' }}
descriptionStyle={{ fontSize: 14, color: '#555' }}
urlStyle={{ fontSize: 12, color: 'grey' }}
titleLines={2}
descriptionLines={3}
showUrl={true}
hideImage={false}
/>
);
`
| Prop | Type | Required | Default | Description |
| ------------------ | ------------------------------------- | -------- | ------------------- | ---------------------------------------------------- |
| url | string | Yes | - | The URL to fetch metadata for |timeout
| | number | No | 3000 | Fetch timeout in milliseconds |onSuccess
| | (data: LinkPreviewResponse) => void | No | - | Callback when data is successfully fetched |onError
| | (error: string) => void | No | - | Callback when fetching metadata fails |onPress
| | (url: string) => void | No | - | Callback when the preview component is pressed |containerStyle
| | ViewStyle | No | - | Style for the container view |imageStyle
| | ImageStyle | No | - | Style for the preview image |titleStyle
| | TextStyle | No | - | Style for the title text |descriptionStyle
| | TextStyle | No | - | Style for the description text |urlStyle
| | TextStyle | No | - | Style for the URL text |titleLines
| | number | No | 2 | Number of lines for title text truncation |descriptionLines
| | number | No | 4 | Number of lines for description text truncation |showUrl
| | boolean | No | true | Whether to show the URL domain below the description |hideImage
| | boolean | No | false | Whether to hide the preview image |visible
| | boolean | No | true | Whether to show or hide the preview component |loaderComponent
| | ReactNode | No | ActivityIndicator | Custom loading component |fallbackImage
| | ImageSourcePropType | No | undefined | Fallback image in case the website doesn't have one |
`json``
{
"status": 200,
"title": "azizbecha - Overview",
"description": "I'm fixing bugs now, I'll write a bio later. azizbecha has 26 repositories available. Follow their code on GitHub.",
"url": "https://github.com/azizbecha",
"images": [
"https://avatars.githubusercontent.com/u/63454940?v=4?s=400"
],
"favicons": [
"https://github.githubassets.com/favicons/favicon.svg"
],
"mediaType": "profile",
"contentType": "text/html",
"siteName": "GitHub"
}
MIT License