Orders Hooks
React Query hooks for order management.
useCreateOrder
Create a new order:
import { useCreateOrder } from '@meaple/react-query'
function CheckoutButton() {
const createOrder = useCreateOrder()
const handleCheckout = async () => {
try {
const order = await createOrder.mutateAsync({
eventId: 'event-123',
tickets: [
{ ticketId: 'ticket-1', quantity: 2 }
],
couponCode: 'SUMMER2024'
})
console.log('Order created:', order.id)
router.push(`/orders/${order.id}`)
} catch (error) {
console.error('Order failed:', error)
}
}
return (
<button
onClick={handleCheckout}
disabled={createOrder.isPending}
>
{createOrder.isPending ? 'Processing...' : 'Complete Purchase'}
</button>
)
}Order Data Structure
interface CreateOrderData {
eventId: string;
tickets: Array<{
ticketId: string;
quantity: number;
}>;
couponCode?: string;
paymentMethod?: string;
billingAddress?: Address;
}With Form Validation
import { useForm } from 'react-hook-form'
import { useCreateOrder } from '@meaple/react-query'
function CheckoutForm() {
const { register, handleSubmit } = useForm()
const createOrder = useCreateOrder()
const onSubmit = async (data) => {
await createOrder.mutateAsync(data)
}
return (
<form onSubmit={handleSubmit(onSubmit)}>
<input {...register('eventId')} />
<input {...register('couponCode')} />
<button type="submit" disabled={createOrder.isPending}>
Create Order
</button>
{createOrder.isError && (
<div>Error: {createOrder.error.message}</div>
)}
</form>
)
}Optimistic Updates
const createOrder = useCreateOrder({
onMutate: async newOrder => {
await queryClient.cancelQueries({ queryKey: ['orders'] });
const previousOrders = queryClient.getQueryData(['orders']);
queryClient.setQueryData(['orders'], old => [...old, newOrder]);
return { previousOrders };
},
onError: (err, newOrder, context) => {
queryClient.setQueryData(['orders'], context.previousOrders);
},
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['orders'] });
},
});Success Callbacks
const createOrder = useCreateOrder({
onSuccess: order => {
toast.success('Order created successfully!');
router.push(`/orders/${order.id}`);
},
onError: error => {
toast.error(`Failed to create order: ${error.message}`);
},
});