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 (
<>
{data?.map(post => - {post.title}
)}
{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'],
},
};