import * as React from 'react'; import { useState } from 'react'; import { QueryClient, useIsMutating } from '@tanstack/react-query'; import fakeRestDataProvider from 'ra-data-fakerest'; import { CoreAdmin, CoreAdminContext, Resource } from '../core'; import { useDelete } from './useDelete'; import { useGetList } from './useGetList'; import type { DataProvider, MutationMode as MutationModeType } from '../types'; import { EditBase, ListBase, RecordsIterator, useDeleteController, WithRecord, } from '../controller'; import { TestMemoryRouter } from '../routing'; import { useNotificationContext } from '../notification'; import { useTakeUndoableMutation } from './undo'; export default { title: 'ra-core/dataProvider/useDelete' }; export const MutationMode = ({ dataProvider, }: { dataProvider?: DataProvider; }) => { const posts = [ { id: 1, title: 'Hello' }, { id: 2, title: 'World' }, ]; const defaultDataProvider = { getList: () => { return Promise.resolve({ data: posts, total: posts.length, }); }, delete: (_, params) => { return new Promise(resolve => { setTimeout(() => { const index = posts.findIndex(p => p.id === params.id); posts.splice(index, 1); resolve({ data: params.previousData }); }, 1000); }); }, } as any; return ( ); }; const MutationModeCore = () => { const isMutating = useIsMutating(); const [success, setSuccess] = useState(); const { data, refetch } = useGetList('posts'); const [mutationMode, setMutationMode] = React.useState('pessimistic'); const [deleteOne, { isPending }] = useDelete( 'posts', { id: 1, previousData: { id: 1, title: 'Hello' }, }, { mutationMode, onSuccess: () => setSuccess('success'), } ); const handleClick = () => { deleteOne(); }; return ( <>
   
{success &&
{success}
} {isMutating !== 0 &&
mutating
} ); }; export const Params = ({ dataProvider }: { dataProvider?: DataProvider }) => { const posts = [ { id: 1, title: 'Hello' }, { id: 2, title: 'World' }, ]; const defaultDataProvider = { getList: () => { return Promise.resolve({ data: posts, total: posts.length, }); }, delete: (_, params) => { return new Promise(resolve => { setTimeout(() => { const index = posts.findIndex(p => p.id === params.id); posts.splice(index, 1); resolve({ data: params.previousData }); }, 1000); }); }, } as any; return ( ); }; const ParamsCore = () => { const isMutating = useIsMutating(); const [success, setSuccess] = useState(); const { data, refetch } = useGetList('posts'); const [params, setParams] = React.useState({}); const [deleteOne, { isPending }] = useDelete( 'posts', { id: 1, previousData: { id: 1, title: 'Hello' }, meta: params.meta, }, { mutationMode: 'optimistic', onSuccess: () => setSuccess('success'), } ); const handleClick = () => { deleteOne(); }; return ( <>
    {data?.map(post =>
  • {post.title}
  • )}
   
{success &&
{success}
} {isMutating !== 0 &&
mutating
} ); }; const Notification = () => { const { notifications, resetNotifications } = useNotificationContext(); const takeMutation = useTakeUndoableMutation(); return notifications.length > 0 ? ( <>
{notifications[0].message}
) : null; }; const DeleteButton = ({ mutationMode }: { mutationMode: MutationModeType }) => { const { isPending, handleDelete } = useDeleteController({ mutationMode, redirect: 'list', }); return ( ); }; export const InvalidateList = ({ mutationMode, }: { mutationMode: MutationModeType; }) => { const dataProvider = fakeRestDataProvider( { posts: [ { id: 1, title: 'Hello' }, { id: 2, title: 'World' }, ], }, process.env.NODE_ENV !== 'test', process.env.NODE_ENV === 'test' ? 10 : 1000 ); return (

Edit Post

(
Title: {record.title}
)} />
} list={ Loading...

}> (
{record.id}: {record.title}
)} />
} />
); }; InvalidateList.args = { mutationMode: 'undoable', }; InvalidateList.argTypes = { mutationMode: { control: { type: 'select', }, options: ['pessimistic', 'optimistic', 'undoable'], }, };