import type { Meta, StoryObj } from "@storybook/react"; import { AdminContext, defaultI18nProvider, ListBase, ListContextProvider, useListContext, } from "react-admin"; import React, { useState, useCallback } from "react"; import { GenerationInstructions } from "@amplicode/storybook-extensions"; import { delayDataProvider } from "../../dataProvider"; import { Box, Paper, Typography, TextField, Button, Stack, } from "@mui/material"; import { Code } from "../../utils"; const docDecorator = (Story: () => React.JSX.Element) => { const [records, setRecords] = useState([ { id: 1, label: "Admin" }, { id: 2, label: "Customer" }, ]); const [record, setRecord] = useState(""); const onButtonClick = useCallback( (_event: React.MouseEvent) => { setRecords((prevRecords) => [ ...prevRecords, { id: (prevRecords.at(-1)?.id || 0) + 1, label: record, }, ]); }, [record, setRecords] ); return ( Whenever react-admin displays a List, it creates a{" "} ListContext to store the list data, as well as filters, pagination, sort state, and callbacks to update them. The ListContext is available to descendants of:{" "} <List>, <ListGuesser>,{" "} <ListBase>, <ReferenceArrayField>,{" "} <ReferenceManyField>. All descendant components can therefore access the list context, using the useListContext hook. As a matter of fact, react-admin’s{" "} <Datagrid>, <FilterForm>, and{" "} <Pagination> components all use the useListContext hook. Component that provides List context Roles {records?.map((role) => { return {role?.label}; })} { setRecord((event.currentTarget as any).value); }} variant="outlined" sx={{ width: 120, margin: 0 }} /> Some inner component Component that needs List context ); }; const meta = { title: "DataProviding/useListContext", parameters: { layout: "centered", }, decorators: [ (Story) => docDecorator(Story), (Story) => defaultDecorator(Story), ], } satisfies Meta; export default meta; type Story = StoryObj; export const Default: Story = { render: () => { const { data, isPending, error } = useListContext(); return ( Roles {data?.map((role) => { return ( {role?.label.toLocaleUpperCase()} ); })} ); }, }; const defaultDecorator = (Story: () => React.JSX.Element) => { return ( {Story()} ); };