autumn-js
Version:
Autumn JS Library
78 lines (74 loc) • 1.82 kB
JavaScript
"use client";
// src/libraries/react/hooks/useCustomerProvider.tsx
import { useState, useRef } from "react";
function useCustomerProvider(client) {
const [stateMap, setStateMap] = useState({});
const inProgressFetches = useRef({});
const getQueryKey = (params) => {
return JSON.stringify(params || {});
};
const getState = (params) => {
const queryKey = getQueryKey(params);
if (!stateMap[queryKey]) {
return {
customer: null,
isLoading: true,
error: null
};
}
return stateMap[queryKey];
};
const refetch = async ({
params,
errorOnNotFound = true
}) => {
const queryKey = getQueryKey(params);
if (inProgressFetches.current[queryKey]) {
return;
}
inProgressFetches.current[queryKey] = true;
setStateMap((prevState) => ({
...prevState,
[queryKey]: {
...prevState[queryKey] || { customer: null },
isLoading: true,
error: null
}
}));
const { data, error } = await client.createCustomer({
expand: params?.expand,
errorOnNotFound
});
let newState = {
customer: data,
isLoading: false,
error
};
setStateMap((prevState) => ({
...prevState,
[queryKey]: newState
}));
inProgressFetches.current[queryKey] = false;
};
const refetchFirstTwo = async () => {
try {
let batchRefetch = [];
for (const key of Object.keys(stateMap)) {
batchRefetch.push(refetch({ params: JSON.parse(key) }));
}
await Promise.all(batchRefetch);
} catch (error) {
console.error("Failed to refetch customer (useCustomerProvider)");
console.error(error);
}
};
return {
// stateMap,
getState,
refetch,
refetchFirstTwo
};
}
export {
useCustomerProvider
};