Skip to main content

Overriding the Order List Page

The Order List page displays the customer's order history. There are two ways to customize this:

  1. Override the Order Card (Recommended): Keeps the platform's list logic but changes individual order items.
  2. Build a Fully Custom List: Complete control over the entire list behavior and layout using the useOrders hook.

Method 1: Override the Order Card (Common)

This is the most efficient way to customize the page. You reuse the standard shopify/order-list block (which handles infinite scrolling) and only provide a custom view for each order entry.

1. Map the Custom Block (blocks.schema.js)

Map the standard block name to your custom component.

import CustomOrderCard from './components/CustomOrderCard';

const OrderBlocks = [
{
name: 'shopify/order-card',
View: CustomOrderCard,
},
];
export default OrderBlocks;

2. Create the Order Card (CustomOrderCard.js)

Use useOrderItem to access processed order data.

import { useOrderItem } from '@appmaker-xyz/shopify';
import { Layout, ThemeText } from '@appmaker-xyz/ui';

const CustomOrderCard = (props) => {
const { order, orderId, status } = useOrderItem(props);
return (
<Layout>
<ThemeText>Order ID: {orderId}</ThemeText>
<ThemeText>Status: {status}</ThemeText>
</Layout>
);
};

Method 2: Creating a Fully Custom List (Advanced)

Use this approach if you need custom filtering, unique list layouts, or want to manage infinite scrolling manually using the useOrders hook.

1. Define a Custom Page Schema (page.schema.js)

Instead of shopify/order-list, use a custom name for your list block.

const OrderListPageSchema = {
blocks: [
{
name: 'custom/manual-order-list',
attributes: {},
},
],
title: 'My Custom Orders',
};
export default OrderListPageSchema;

2. Implement the Custom List Component (ManualOrderList.js)

Use the useOrders hook to fetch data and handle pagination.

import React from 'react';
import { FlatList, ActivityIndicator } from 'react-native';
import { useOrders } from '@appmaker-xyz/shopify';
import { Layout, ThemeText } from '@appmaker-xyz/ui';

const ManualOrderList = () => {
const {
orderList,
isLoading,
isFetching,
hasNextPage,
fetchNextPage
} = useOrders({ limit: 10 });

if (isLoading) return <ActivityIndicator />;

return (
<FlatList
data={orderList}
keyExtractor={(item) => item.node.id}
renderItem={({ item }) => (
<Layout style={{ padding: 16, borderBottomWidth: 1 }}>
<ThemeText>Order: {item.node.name}</ThemeText>
<ThemeText>Total: {item.node.totalPrice.amount}</ThemeText>
</Layout>
)}
onEndReached={() => {
if (hasNextPage) fetchNextPage();
}}
onEndReachedThreshold={0.5}
ListFooterComponent={() =>
isFetching ? <ActivityIndicator style={{ padding: 20 }} /> : null
}
/>
);
};

export default ManualOrderList;

3. Register the Custom Block (blocks.schema.js)

import ManualOrderList from './components/ManualOrderList';

const OrderBlocks = [
{
name: 'custom/manual-order-list',
View: ManualOrderList,
},
];
export default OrderBlocks;

Theme Integration

As per the modular pattern, register your collected pages and blocks in the main theme entry point.

1. Register Page (src/pages/index.js)

export const pages = {
OrderList: OrderListPageSchema,
};

2. Register Blocks (src/blocks.js)

export const blocks = [
...OrderBlocks,
];

3. Register Theme (src/index.js)

import { registerTheme } from '@appmaker-xyz/core';
import { pages } from './pages';
import { blocks } from './blocks';

registerTheme({ id: 'my-theme', pages, blocks });