UNPKG

autumn-js

Version:

Autumn JS Library

78 lines (74 loc) 1.82 kB
"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 };