import { Link, useLoaderData, useNavigation, useSearchParams, } from 'react-router'; import type {Route} from './+types/account.orders._index'; import {useRef} from 'react'; import { Money, getPaginationVariables, flattenConnection, } from '@shopify/hydrogen'; import { buildOrderSearchQuery, parseOrderFilters, ORDER_FILTER_FIELDS, type OrderFilterParams, } from '~/lib/orderFilters'; import {CUSTOMER_ORDERS_QUERY} from '~/graphql/customer-account/CustomerOrdersQuery'; import type { CustomerOrdersFragment, OrderItemFragment, } from 'customer-accountapi.generated'; import {PaginatedResourceSection} from '~/components/PaginatedResourceSection'; type OrdersLoaderData = { customer: CustomerOrdersFragment; filters: OrderFilterParams; }; export const meta: Route.MetaFunction = () => { return [{title: 'Orders'}]; }; export async function loader({request, context}: Route.LoaderArgs) { const {customerAccount} = context; const paginationVariables = getPaginationVariables(request, { pageBy: 20, }); const url = new URL(request.url); const filters = parseOrderFilters(url.searchParams); const query = buildOrderSearchQuery(filters); const {data, errors} = await customerAccount.query(CUSTOMER_ORDERS_QUERY, { variables: { ...paginationVariables, query, language: customerAccount.i18n.language, }, }); if (errors?.length || !data?.customer) { throw Error('Customer orders not found'); } return {customer: data.customer, filters}; } export default function Orders() { const {customer, filters} = useLoaderData(); const {orders} = customer; return (
); } function OrdersTable({ orders, filters, }: { orders: CustomerOrdersFragment['orders']; filters: OrderFilterParams; }) { const hasFilters = !!(filters.name || filters.confirmationNumber); return (
{orders?.nodes.length ? ( {({node: order}) => } ) : ( )}
); } function EmptyOrders({hasFilters = false}: {hasFilters?: boolean}) { return (
{hasFilters ? ( <>

No orders found matching your search.


Clear filters →

) : ( <>

You haven't placed any orders yet.


Start Shopping →

)}
); } function OrderSearchForm({ currentFilters, }: { currentFilters: OrderFilterParams; }) { const [searchParams, setSearchParams] = useSearchParams(); const navigation = useNavigation(); const isSearching = navigation.state !== 'idle' && navigation.location?.pathname?.includes('orders'); const formRef = useRef(null); const handleSubmit = (event: React.FormEvent) => { event.preventDefault(); const formData = new FormData(event.currentTarget); const params = new URLSearchParams(); const name = formData.get(ORDER_FILTER_FIELDS.NAME)?.toString().trim(); const confirmationNumber = formData .get(ORDER_FILTER_FIELDS.CONFIRMATION_NUMBER) ?.toString() .trim(); if (name) params.set(ORDER_FILTER_FIELDS.NAME, name); if (confirmationNumber) params.set(ORDER_FILTER_FIELDS.CONFIRMATION_NUMBER, confirmationNumber); setSearchParams(params); }; const hasFilters = currentFilters.name || currentFilters.confirmationNumber; return (
Filter Orders
{hasFilters && ( )}
); } function OrderItem({order}: {order: OrderItemFragment}) { const fulfillmentStatus = flattenConnection(order.fulfillments)[0]?.status; return ( <>
#{order.number}

{new Date(order.processedAt).toDateString()}

{order.confirmationNumber && (

Confirmation: {order.confirmationNumber}

)}

{order.financialStatus}

{fulfillmentStatus &&

{fulfillmentStatus}

} View Order →

); }