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 { useDeleteMany } from './useDeleteMany'; import { useGetList } from './useGetList'; import type { DataProvider, MutationMode as MutationModeType } from '../types'; import { TestMemoryRouter, useRedirect } from '../routing'; import { useNotificationContext, useNotify } from '../notification'; import { useTakeUndoableMutation } from './undo'; import { EditBase, ListBase, RecordsIterator } from '../controller'; export default { title: 'ra-core/dataProvider/useDeleteMany' }; export const MutationMode = () => { let posts = [ { id: 1, title: 'Hello' }, { id: 2, title: 'World' }, ]; const dataProvider = { getList: () => { return Promise.resolve({ data: posts, total: posts.length, }); }, deleteMany: (_, params) => { return new Promise(resolve => { setTimeout(() => { posts = posts.filter(post => !params.ids.includes(post.id)); 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 [deleteMany, { isPending }] = useDeleteMany( 'posts', { ids: [1], }, { mutationMode, onSuccess: () => setSuccess('success'), } ); const handleClick = () => { deleteMany(); }; return ( <>
   
{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 notify = useNotify(); const redirect = useRedirect(); const [deleteMany, { isPending }] = useDeleteMany(); const handleClick = () => { deleteMany( 'posts', { ids: [1], }, { mutationMode, onSuccess: () => { notify('resources.posts.notifications.deleted', { type: 'info', undoable: mutationMode === 'undoable', }); redirect('list', 'posts'); }, } ); }; 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

} list={ Loading...

}> (
{record.id}: {record.title}
)} />
} />
); }; InvalidateList.args = { mutationMode: 'undoable', }; InvalidateList.argTypes = { mutationMode: { control: { type: 'select', }, options: ['pessimistic', 'optimistic', 'undoable'], }, }; export const Params = ({ dataProvider }: { dataProvider?: DataProvider }) => { let posts = [ { id: 1, title: 'Hello' }, { id: 2, title: 'World' }, ]; const defaultDataProvider = { getList: () => { return Promise.resolve({ data: posts, total: posts.length, }); }, deleteMany: (_, params) => { return new Promise(resolve => { setTimeout(() => { posts = posts.filter(post => !params.ids.includes(post.id)); 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 [deleteMany, { isPending }] = useDeleteMany( 'posts', { ids: [1], meta: params.meta, }, { mutationMode: 'optimistic', onSuccess: () => setSuccess('success'), } ); const handleClick = () => { deleteMany(); }; return ( <>
    {data?.map(post =>
  • {post.title}
  • )}
   
{success &&
{success}
} {isMutating !== 0 &&
mutating
} ); };