import { useEffect, useState } from 'react';
import * as WebP from 'react-native-webp-converter';
const defaultConfig: WebP.WebPConfig = {
quality: 80,
type: WebP.Type.LOSSY,
preset: WebP.Preset.DEFAULT,
};
/**
* ### Easily call useConverter for rapid conversion
* @param inputPathOnMount (optional) Path to the input image for immediate conversion on mount
* @param configOnMount Configuration settings for WebP conversion
* @returns `{ uri, error, isLoading, convert }`
* @deprecated
* ### Example
* ```tsx
* import * as WebP from 'react-native-webp-converter';
* import { StyleSheet, Image, ActivityIndicator, Text } from 'react-native';
*
* export default function App() {
* const image = WebP.useConverter('my-local-image.png');
*
* if (image.isLoading) return ;
*
* if (image.error) return {image.error?.message};
*
* return ;
* }
* ```
*
* or
*
* ```tsx
* import * as WebP from 'react-native-webp-converter';
* import { StyleSheet, Image, ActivityIndicator, Text } from 'react-native';
*
* export default function App() {
* const image = WebP.useConverter();
*
* useEffect(()=>{
* image.convert('my-local-image.png')
* },[])
*
* if (image.isLoading) return ;
*
* if (image.error) return {image.error?.message};
*
* return ;
* }
* ```
*/
export function useConverter(
inputPathOnMount?: string,
configOnMount = defaultConfig
) {
const [uri, setUri] = useState(null);
const [error, setError] = useState();
const [isLoading, setLoading] = useState(false);
/**
* ### Manually initiate image conversion
* @param inputPath - Path to the image to convert
* @param config - Configuration options for WebPConfig conversion
* @returns `void`
*/
const convert = async (
inputPath: string,
config = defaultConfig
): Promise => {
try {
if (!inputPath) {
console.warn('Missing argument for inputPath');
return;
}
setLoading(true);
const outputPath = inputPath.replace(/\.\w+$/, `-${Date.now()}.webp`);
await WebP.convertImage(inputPath, outputPath, config);
setLoading(false);
setUri(outputPath);
} catch (err) {
console.error(err);
setError(err);
} finally {
setLoading(false);
}
};
useEffect(() => {
if (!inputPathOnMount) return;
convert(inputPathOnMount, {
quality: configOnMount.quality,
type: configOnMount.type,
preset: configOnMount.preset,
});
}, [
inputPathOnMount,
configOnMount.type,
configOnMount.quality,
configOnMount.preset,
]);
useEffect(() => {
setError(undefined);
}, [inputPathOnMount]);
return {
uri,
error,
isLoading,
convert,
};
}