@smartinvoicexyz/hooks
Version:
Unified source for React hooks used across the Smart Invoice protocol.
45 lines (44 loc) • 1.73 kB
JavaScript
import { INVOICE_VERSION } from '@smartinvoicexyz/constants';
import { validateBasicMetadata, validateInvoiceMetadata, } from '@smartinvoicexyz/types';
import { convertIpfsCidV0ToByte32, fetchToken, handleDetailsPin, logDebug, } from '@smartinvoicexyz/utils';
import { useQuery } from '@tanstack/react-query';
import { useCallback, useMemo } from 'react';
const generateName = ({ title, createdAt }) => `${title} - ${createdAt} - ${INVOICE_VERSION}`;
export const useDetailsPin = (details, isBasic = false) => {
const validatedDetails = useMemo(() => {
if (details === null) {
return null;
}
if (isBasic) {
if (!validateBasicMetadata(details)) {
logDebug('Invalid basic metadata: ', details);
return null;
}
return details;
}
if (!validateInvoiceMetadata(details)) {
logDebug('Invalid invoice metadata: ', details);
return null;
}
return details;
}, [isBasic, details]);
const uploadToIpfs = useCallback(async () => {
const token = await fetchToken();
if (!validatedDetails || !token)
return null;
const cid = await handleDetailsPin({
details: validatedDetails,
name: generateName(validatedDetails),
token,
});
return convertIpfsCidV0ToByte32(cid);
}, [validatedDetails]);
const { data, isLoading, error } = useQuery({
queryKey: ['detailsPin', JSON.stringify(validatedDetails)],
queryFn: uploadToIpfs,
enabled: !!validatedDetails,
staleTime: Infinity,
refetchInterval: false,
});
return { data, isLoading, error };
};