Asynchronous Hooks

Asynchronous hooks status interface

useStartFinishErrors
const { updateAddress, ...updateStatus } = useCustomerUpdateAddress();

// Main status helpers
const { started, finished, success, errors, reset, } = updateStatus;

Async hooks options

autoReset hook option
// With autoReset
const { updateAddress, ...status } = useCustomerUpdateAddress({ autoReset: 2000 });

// status.success lifecycle example (autoReset)
false -> true || false -> 2000ms -> false
 
// status.errors lifecycle example (autoReset)
[] -> ['error one'] || [] -> 2000ms -> []


// Without autoreset
const { updateAddress, ...status } = useCustomerUpdateAddress();

// status.success lifecycle example
false -> true || false
 
// status.errors lifecycle example
[] -> ['error one'] || []

Using async hook status

AddressEdit.jsx - Pseudo code example
import { useCustomerUpdateAddress } from '@backpackjs/storefront';

const AddressEdit = ({ address ) => {
  const { updateAddress, ...updateStatus } = useCustomerUpdateAddress();
  
  // fake updated form data
  const [editedData, setEditedData] = useState(...) // fictional fields data
  const [isDefault, setIsDefault] = useState(...) // fictional fields data
  
  // reset on finish — see autoReset hooks API prop for a short hand
  useEffect(() => {
    if (!updateStatus?.finished) return;
    updateStatus.ref = setTimeout(() => {
     updateStatus.reset();
     clearTimeout(updateStatus.ref.current);
    }, 2000)
  }, [updateStatus?.finished])
  
  
  // handle form submit
  const updateAddressOnSubmit = async (event) => {
    event.preventDefault();
    
    // update address
    const updatedAddress = await updateAddress({
      id: address.id,
      isDefault: isDefault,
      address: editedData
    });

    if (updatedAddress) {
      console.log('Address updated ✅')
    }
  }
  
  return (
    <div class='AddressEdit'>
    
      <EditForm onSubmit={updateAddressOnSubmit}>
        <Fields...>
      </EditForm>

      // Fictional status display
      <Status>
        { updateStatus?.started && <Loader /> }
        { updateStatus?.success && <Success /> } 
        { updateStatus?.errors && <Errors errors={updateStatus?.errors} /> }
      </Status>
    </div>     
  )
}

Last updated